一.作用
volatile保证共享变量的可见性。
二.原理
被volatile修饰的变量进行写操作的时候,其汇编代码会多出一条带Lock前缀的指令addl,这个Lock前缀指令在多核处理器下会引发两件事:
- 将当前处理器缓存行的数据写回到系统内存
- 这个写回操作使得在其他CPU里缓存了该内存地址的数据无效。
所以,当一个线程修改某个被volatile修饰的变量时,其他线程能够立即读到该变量的最新值,保证可见性。
三.优化
- LinkedTransferQueue这个类在使用volatile变量的时候,用追加的字节的方式来优化出队和入队。LinkedTransferQueue 用一个内部类来定义队列的头结点和尾节点,内部类PaddedAtomicReference追加了15个变量(共60字节),加上父类的value变量,一共64字节。
- 为什么追加字节可以优化呢?
因为很多处理器的高速缓存行是64字节宽。当字节不足64的时候,处理器会将它们都读到同一个高速缓存行,所以如果两个volatile节点同时写操作就会相互锁住同一个缓存行。 - 以下可以不用这种方式:
a.当处理器的高速缓存行不是64字节宽;
b.Volatile变量写入没有那么频繁。