线程安全性(2)

可见性:可见性指的是一个线程对主内存的修改可以被其他线程及时地察觉到。

导致共享变量在线程间不可见的原因:

1、线程交叉执行

2、指令重排序结合线程交叉执行

3、共享变量的值没有及时更新到主存中


Java内存模型:Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。

JVM提供了synchronized和volatile关键字来保证可见性

volatile:它通过内存屏障禁止指令重排序来保证可见性

1、对volatile变量写操作时,会在写操作前后加入一条store内存屏障,然后将共享变量值刷新到主内存中。

2、对volatile变量读操作是,会在读操作后加入一条load内存屏障,从主存中读取最新变量到工作内存。

volatile写   

          volatile写

volatile读

             volatile读

一般有两种情况使用volatile变量

1、用来作为状态标记量。

2、双重检测

 1 public class SingletonExample {
 2     private SingletonExample() {
 3         
 4     }
 5     //单例对象
 6     private volatile static SingletonExample instance=null;
 7     //静态的工厂方法
 8     public static SingletonExample singletonExample() {
 9         if(instance==null) {//双重检测机制
10             synchronized (SingletonExample.class) {//同步锁
11                 if (instance==null) {
12                     instance=new SingletonExample();
13                 }
14             }
15         }
16         return instance;
17     }    
18 }

猜你喜欢

转载自www.cnblogs.com/ruiruijiang/p/12334911.html