功能:
volatile提供了稍弱的同步机制。被volatile修饰的变量可确保将变量的更新及时通知到其他线程。
编译器不会针对volatile修改的变量与其他变量内存重排序。
valatile不会缓存到寄存器。
访问volatile不会执行加锁操作。
使用
volatile最亮眼的是它的可见性。
从内存可见性角度看:读取volatile相当于进入同步代码、写入volatile变量相当于退出同步代码区
volatile boolean asleep;
while(!asleep)
...
这个是volatile的典型应用模式。
volatile只是确保变量的可见性,不足以操作的原子性,例如volatile int i=0; i++;
同步机制既可以确保共享变量的可见性、也可以确保原子性
volatile使用情形条件:
1、对变量写入操作不依赖当前变量的值,或确保只有单个线程操作变量
2、该变量不与其他状态变量一起纳入不变性条件
3、访问变量时不需要加锁。
原理
volatile修饰的变量在操作之前会引发缓存锁定:
1、将当前处理器缓存回写到系统的内存中
2、回写内存导致其他CPU里的缓存无效。
缓存锁定确保缓存一致性,会阻止同时修改有两个以上的cpu缓存的内存数据。