码迷,mamicode.com
首页 > 编程语言 > 详细

线程安全性(2)

时间:2020-02-20 11:41:36      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:状态   webp   静态   对象   orm   程序   one   通过   class   

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

 

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

1、线程交叉执行

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

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


 

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

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

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

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

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

技术图片   

          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 }

 

线程安全性(2)

标签:状态   webp   静态   对象   orm   程序   one   通过   class   

原文地址:https://www.cnblogs.com/ruiruijiang/p/12334911.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!