并发与高并发-线程安全性-可见性
Posted jmy520
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发与高并发-线程安全性-可见性相关的知识,希望对你有一定的参考价值。
前言
乍看可见性,不明白它的意思。联想到线程,意思就是一个线程对主内存的修改及时的被另一个线程观察到,即为可见性。
那么既然有可见性,会不会存在不可见性呢?
答案是肯定的,导致线程不可见的原因是什么呢?
有三个原因:
(1)线程交叉执行。
(2)重排序结合线程交叉执行。
(3)共享变量更新后的值没有在工作内存与主存间及时更新。
主体内容
一、这里的可见性涉及到synchronized,顺便了解一些一下JMM对synchronized的两条规定:
1.线程解锁前,必须把共享变量的最新值刷新到主内存中
2.线程加锁时,将清空工作内存中存储的共享变量的值,从而使用共享变量时,必须从主内存中重新读取最新的值。(注意:解锁和加锁,是指同一把锁)
二、同时涉及到volatile。
1.volatile通过内存屏障和禁止重排序优化来实现内存可见性。
(1)对volatile变量进行写的操作时,会在写操作后加入一条store屏障指令,将本地内存中的共享变量值刷新到主内存。
(2)对volatile变量进行读的操作时,会在读操作前加入一条load屏障指令,从主内存中读取共享变量。
这样就能保证线程读写的都是最新的值。
简单的通过两张图分别看一下读写操作时的过程。
volatile写插入内存屏障示意图
volatile读插入内存屏障示意图
以上是关于并发与高并发-线程安全性-可见性的主要内容,如果未能解决你的问题,请参考以下文章