并发与高并发(九)-线程安全性-可见性

前言

乍看可见性,不明白它的意思。联想到线程,意思就是一个线程对主内存的修改及时的被另一个线程观察到,即为可见性

那么既然有可见性,会不会存在不可见性呢?

答案是肯定的,导致线程不可见的原因是什么呢?

有三个原因:

(1)线程交叉执行。

(2)重排序结合线程交叉执行。

(3)共享变量更新后的值没有在工作内存与主存间及时更新。

主体内容

一、这里的可见性涉及到synchronized,顺便了解一些一下JMM对synchronized的两条规定:

  1.线程解锁前,必须把共享变量的最新值刷新到主内存中

  2.线程加锁时,将清空工作内存中存储的共享变量的值,从而使用共享变量时,必须从主内存中重新读取最新的值。(注意:解锁和加锁,是指同一把锁)

二、同时涉及到volatile。

  1.volatile通过内存屏障和禁止重排序优化来实现内存可见性。

  (1)对volatile变量进行的操作时,会在写操作后加入一条store屏障指令,将本地内存中的共享变量值刷新到主内存。

  (2)对volatile变量进行的操作时,会在读操作前加入一条load屏障指令,从主内存中读取共享变量。

  这样就能保证线程读写的都是最新的值。

  简单的通过两张图分别看一下读写操作时的过程。

                     

      volatile写插入内存屏障示意图

         

         volatile读插入内存屏障示意图

猜你喜欢

转载自www.cnblogs.com/jmy520/p/12046052.html