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

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

时间:2019-12-15 21:41:51      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:它的   idt   过程   原因   观察   刷新   简单的   ola   code   

前言

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

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

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

有三个原因:

(1)线程交叉执行。

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

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

主体内容

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

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

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

二、同时涉及到volatile。

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

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

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

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

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

技术图片                     

      volatile写插入内存屏障示意图

 

         技术图片

         volatile读插入内存屏障示意图

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

标签:它的   idt   过程   原因   观察   刷新   简单的   ola   code   

原文地址:https://www.cnblogs.com/jmy520/p/12046052.html

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