学习笔记(36):第1章 分布式基础之并发编程-探索线程安全性背后的本质之volatile 01

立即学习:https://edu.csdn.net/course/play/29000/405250?utm_source=blogtoedu

1、可见性问题:

加锁或者释放锁都会同步主内存

System.out.println():方法涉及了IO操作和Sync加锁,所以这个方法会导致内存同步

2、什么是可见性问题

在多线程环境下,共享变量的修改 不可见

3、可见性问题的由来

这要从硬件层面的优化来说:

(1)CPU 层面添加了高速缓存-三级缓存

(2)操作系统层面,引入了进程、线程、CPU时间片的切换->线程进入阻塞后,cpu不会苦苦等待,而是进行切换去执行其他线程

(3)编译的优化,更合理的利用CPU的高速缓存

综上所述,导致可见性问题的根本就是CPU层面添加了高速缓存,会导致缓存一致性问题,CPU0中的 对其高速缓存中某值的修改,没有及时刷新到主内存中,CPU1对主内存的读取,读到了脏数据没有读到CPU0最新的修改值

5、如何解决缓存一致性问题呢?-缓存锁

注意缓存锁,只会缓存自己涉及到修改的变量,对于只读的变量,不会缓存,加入CPU0中修改变量b,但是CPU1中对于变量b是只读的,那么CPU1是可以看到CPU0中b的真值的

一个cpu中的共享变量修改时,会使其他CPU中的缓存失效,然后修改主内存,其他CPU重新从主内存中读取数据,这个引入了storeBuffer,导致异步问题,也就会出现 CPU指令重排序问题

 

storeBuffer是如何运行的呢?

针对共享变量,如果CPU0修改了共享变量a的值,CPU0会先把修改后的值放入 storeBuffer,而不是高速缓存中,等接收到CPU1的反馈(缓存清除)后才会更新到自己的高速缓存中,然后再同步到主内存中

6、Volatile关键字 是共享变量在多线程中保证可见的关键字

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值