Java多线程之Volatile详解
Volatile不加锁,单每次读取从主内存读,,每次写要写回到主内存;相当于轻量级的Synchronized,编码少,开销少,但是没有原子性,性能比Synchronized好。
Volatile具有的特性
- 可见性
- 顺序性
- 没有原子性
正确使用Volatile
- 对变量的写操作不依赖当前值;不能做线程安全计数器,i++,其实步骤是:读取 - 修改 - 写入,对于不支持原子性的Volatile是不安全的
- 该变量没有包含在具有其他变量的不变式中
Volatile性能开销
- 读操作开销非常低,几乎和非Volatile读操作一样
- 写操作开销比非Volatile写操作多很多
- Volatile总开销俾Synchronized低
注意:在Volatile安全使用的情况下,Volatile的可伸缩性强,如读操作远超过写操作,对比锁,可降低性能开销
Volatile适用场景
- 不能做线程计数器
- 状态标志
- 一次性安全发布
- 独立观察
- Volatile bean模式
- 开销低的读写策略
volatile不能保证原子性而Atomic可以,例如:AtomicLong