特性
可见性
volatile变量,是稍弱的同步机制,不会被缓存到寄存器或者其他处理器不可见的地方,因此读取时,总会返回当前的最新值。这个性质,就是可见性,是Volatile的关键作用之一。但是Volatile的语义不足以确保递增操作的原子性,在多线程的情况下,线程不一定是安全的。
禁止重排序
因为编译器优化、指令重排序、内存系统重排序原因,程序执行的顺序,不一定等于我们编写的顺序,Volatile会禁止重排序。
常用场景:
禁止重排序
单例模式(懒汉模式)
我们模拟两个线程A,B,在还没创建单例对象的时候,一起进入getInstance方法。
- A进入16行,此时singleton为空,时间片结束。
- B也进入16行,获取到的singleton也是空,时间片结束。
- A进入17行,这边是对象锁,,B在等待A执行完这个代码块。
- A执行完,生成singleton对象,由于重排序,singleton对象的其他域可能还没初始化。
- B继续执行,此时获取singleton,但是其他域可能还没初始化,调用时,报空指针异常。
可见性
检查某个状态标记,以判断是否退出循环
Volatile boolean done;
....
某个方法{
while(done){
doSomeThing1();
}
doSomeThing2();
}
这边和用普通的变量的区别是,在多线程的情况下,取到done后,done的值被改变了,while判断会不正确。
使用的条件
- 对变量的写入操作,不依赖变量的当前值,或者确保单线程更新变量的值
- 该变量不会和其他变量一起纳入不变形条件中
- 访问变量时,不需要加锁
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。