线程安全性

Posted ruiruijiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程安全性相关的知识,希望对你有一定的参考价值。

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

 

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

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 }

 

以上是关于线程安全性的主要内容,如果未能解决你的问题,请参考以下文章

HashMap 和 ConcurrentHashMap 的区别

线程同步-使用ReaderWriterLockSlim类

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

多线程 Thread 线程同步 synchronized

活动到片段方法调用带有进度条的线程

多个用户访问同一段代码