Volatile保证可见性、不保证原子性

前言

  1. 简单明了的说明 Volatile ,提供适合的使用场景。

步骤

  1. 参考博客
  2. 没有 Volatile 的情况
  3. 有 Volatile 保证可见性的情况
  4. 有 Volatile 不保证原子性的情况
  5. Volatile 适用场景

1. 参考博客

石杉的架构笔记

2. 没有 Volatile 的情况

在这里插入图片描述

  1. 线程1 修改data = 0,刷新到 工作内存中
  2. 线程1 的工作内存,刷新到 主内存中,不是实时的。这个时候线程2 如果执行 data 还是 0
  3. 导致的问题:线程1 和 线程2 的 data 数据不一致

3. 有 Volatile 保证可见性的情况

在这里插入图片描述

  1. 线程1 修改data = 0,刷新到 工作内存中,同时强制刷新到 主内存中
  2. 线程2 工作内存的 data=0 失效了。这个时候 线程2 如果使用 data 数据,会强制从 主内存中获取 data=1
  3. 这就是可见性,一个线程修改了值,其他线程都可以收到最新的值。

4. 有 Volatile 不保证原子性的情况

在这里插入图片描述

  1. data=1 实际不是原子操作,经过了三步。
  2. 线程1 执行,已经执行完 temp ,Cpu时间片到了线程2。
  3. 这时,线程2 执行完了整个流程,主内存data=1,同时线程1的 data=0 失效了。
  4. 但是,data 已经使用完了,data的最新值对 线程1 的 temp 没有作用了。
  5. 最后执行结果,主内存还是 data = 1

5. Volatile 适用场景

  1. 多线程读取一个值,修改值,通过一个加锁方法。
public class Main {

    private int value;
    
    public synchronized void updateValue(int value){
        this.value = value;
    }

    public int getValue() {
        return value;
    }

}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值