当一个变量被volatile修饰,我们所说的不发生指令重排的具体含义如下
- (happens-before语意)volatile作为一个屏障在发生volatile的读写的时候,周围的几条指令不会被重排,这个周围怎么理解,什么时候又可以重排了呢。
- (可见性语意)使用volatile保证了每次读写的时候都可以拿到最新的版本,这个最新版本看老师课堂上讲的是L3缓存或者是内存,而一个变量的修改从L1缓存传播到L3缓存是需要时间的,那么另外一个稍晚但是准备读取最新变量值是怎么感知到变量的修改,而需要等待获取最新值。让我感觉到困惑的依然是其实多核CPU其实也是一个多副本的数据库,每个寄存器依然相当数据库,在这种并发场景下,怎么保证读取和写入像是“线性”的呢。