线程可见性

导致共享变量在线程间不可见的原因:

1:线程交叉执行:

2:重排序结婚线程交叉执行

3:共享变量更新后值没有在工作内存和主存间即时更新

 JMM 关于synchronized的两条规定:

1 线程解锁钱,必须把共享变量的最新值写到主内存

2:线程加锁时,将清空工作内存中的变量值,从而使用共享变量时需要从主内存中重新读取最新值(加锁解锁是同一把锁)

可见性 - volatile

对volatile变量写操作时,会在写操作后加入一条store屏障,将本地内存中的共享变量值刷新到主存

对volatile读操作时,会在读前面加入一条load屏障指令,从主内存中读取共享变量

线程可见性

 

volatile 使用情况

1 对变量的写不依赖当前值

2 适合状态标记量