为什么保证了可见性而不能线程安全。
场景:
volatile修饰的x
多线程进行x++
x++是非原子操作分三个步骤:
(1)读取x的值
(2)计算x值+1
(3)写入x的值到内存
假设:线程一执行完(2)算出了值后被阻塞
线程二执行完三个操作后将结果写回内存,由于线程一已经算出结果不会再去读取x的值,
volatile导致缓存失效对线程一的计算结果已经无影响了,
所以线程一唤醒后接着写入,导致并发失败。
使用场景:
简单赋值和读取
禁止重排序
提供什么保证:
1)可见性保证,一个线程的写优先另一个线程的读
2)禁止指令重排序volatile是屏障上面和下面的不能进行重排序