Volatile保证可见性、不保证原子性
前言
简单明了的说明 Volatile ,提供适合的使用场景。
步骤
参考博客 没有 Volatile 的情况 有 Volatile 保证可见性的情况 有 Volatile 不保证原子性的情况 Volatile 适用场景
1. 参考博客
石杉的架构笔记
2. 没有 Volatile 的情况
线程1 修改data = 0,刷新到 工作内存中 线程1 的工作内存,刷新到 主内存中,不是实时的。这个时候线程2 如果执行 data 还是 0 导致的问题:线程1 和 线程2 的 data 数据不一致
3. 有 Volatile 保证可见性的情况
线程1 修改data = 0,刷新到 工作内存中,同时强制刷新到 主内存中 线程2 工作内存的 data=0 失效了。这个时候 线程2 如果使用 data 数据,会强制从 主内存中获取 data=1 这就是可见性,一个线程修改了值,其他线程都可以收到最新的值。
4. 有 Volatile 不保证原子性的情况
data=1 实际不是原子操作,经过了三步。 线程1 执行,已经执行完 temp ,Cpu时间片到了线程2。 这时,线程2 执行完了整个流程,主内存data=1,同时线程1的 data=0 失效了。 但是,data 已经使用完了,data的最新值对 线程1 的 temp 没有作用了。 最后执行结果,主内存还是 data = 1
5. Volatile 适用场景
多线程读取一个值,修改值,通过一个加锁方法。
public class Main { private int value; public synchronized void updateValue(int value){ this.value = value; } public int getValue() { return value; } }
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
【程序人生】IT界含金量高的证书