立即学习: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关键字 是共享变量在多线程中保证可见的关键字