Volatile关键字实现原理

Volatile关键字的作用?

  让其他线程能够马上感知到某一线程对某个变量的修改。

  1)保证可见性,对共享变量的修改,其他线程马上能感知到,但不能保证原子性。

  2)保证有序性,在JVM的编译阶段和指令优化排序阶段,对于volatile修饰的变量,其代码顺序不会改变。

Volatile和Synchronized的区别?

  (1)使用上的区别

    Volatile只能修饰变量,synchronized只能修饰方法和语句块

  (2)对原子性的保证

    synchronized可以保证原子性,Volatile不能保证原子性

  (3)对可见性的保证

    都可以保证可见性,但实现原理不同

    Volatile对变量加了lock,synchronized使用monitorEnter和monitorexit  monitor  JVM

  (4)对有序性的保证

    Volatile能保证有序,synchronized可以保证有序性,但是代价(重量级)并发退化到串行

  (5)其他

    synchronized引起阻塞

    Volatile不会引起阻塞

volatile的使用:

 1 public class VolitaleDemo01 {
 2 
 3     final static int MAX = 5;
 4     //static int init_value = 0;如果不加volatile,不能保证更新完后读数据
 5     static volatile int init_value = 0;
 6     
 7     public static void main(String[] args) {
 8         new Thread(()->{
 9             int localValue = init_value;
10             while(localValue<MAX){
11                 if(localValue!=init_value){
12                     System.out.println("Reader:"+init_value);
13                     localValue = init_value;
14                 }
15             }
16         },"Reader").start();
17         new Thread(()->{
18             int localValue = init_value;
19             while(localValue<MAX){
20                 System.out.println("Updater:"+(++localValue));
21                 init_value = localValue;
22                 try {
23                     TimeUnit.SECONDS.sleep(2);
24                 } catch (InterruptedException e) {
25                     // TODO Auto-generated catch block
26                     e.printStackTrace();
27                 }
28             }
29         },"Updater").start();
30     }
31 
32 }
原文地址:https://www.cnblogs.com/wk-missQ1/p/12369854.html