回答
volatile
是一种轻量级的同步机制,它能保证共享变量的可见性,同时禁止重排序保证了操作的有序性,但是它无法保证原子性。所以使用 volatile
必须要满足这两个条件:
- 写入变量不依赖当前值。
- 变量不参与与其他变量的不变性条件。
volatile
比较适合多个线程读,一个线程写的场合,典型的场景有如下几个:
- 状态标志
- 重检查锁定的单例模式
- 开销较低的“读-写锁”策略
详解
volatile 使用条件
要想正确安全地使用 volatile
,必须要具备这两个条件:
- 写入变量不依赖当前值:变量的新值不能依赖于之前的旧值。如果变量的当前值与新值之间存在依赖关系,那么仅使用
volatile
是不够的,因为它不能保证一系列操作的原子性。比如 i++。 - 变量不参与与其他变量的不变性条件:如果一个变量是与其他变量共同参与不变性条件的一部分,那么简单地声明变量为
volatile
是不够的。