是什么?
volatile 是一种同步机制,比 synchronized 或者 Lock 相关类更轻量,因为 volatile 并不会发生上下文切换 等开销很大的行为。
如果一个变量被修改成 volatile,那么JVM 就知道了这个变量可能会被并发修改。
开销小,相应的能力也小,虽然说 bolatile 是用来同步的保证线程安全的,但是 volatile 做不到 synchronized 那样的原子保护,volatile 仅在很有限的场景下才能发挥作用。
作用
保证可见性、禁止重排序
适用于:如果一个共享变量被各个线程赋值,没有其他操作,那么就可以用 volatile 来替代 synchronized 或者替代原子变量,因为赋值本身是具有原子性的,而 volatile 有保证了可见性,所以就可以保证线程安全。也可以适用于刷新之前变量的触发器。
例如:a = 3,这个操作除了赋值没有其他操作。
不适用于:如果一个共享变量除了赋值以外有其他的对比、取值等操作,就不适用。
例如:a++,这个操作需要先取值在赋值。