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

Posted jmy520

tags:

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

前言

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

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

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

有三个原因:

(1)线程交叉执行。

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

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

主体内容

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

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

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

二、同时涉及到volatile。

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

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

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

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

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

技术图片                     

      volatile写插入内存屏障示意图

 

         技术图片

         volatile读插入内存屏障示意图

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

Java并发编程与高并发解决方案 视频教程

高并发第三弹:线程安全-原子性

多线程与高并发线程安全

多线程与高并发线程安全

JAVA并发编程递进篇,探索线程安全性volatile关键字如何保证可见性

JAVA并发编程递进篇,探索线程安全性volatile关键字如何保证可见性