Java多线程之Volatile详解

Java多线程之Volatile详解

 

Volatile不加锁,单每次读取从主内存读,,每次写要写回到主内存;相当于轻量级的Synchronized,编码少,开销少,但是没有原子性,性能比Synchronized好。

 

 

 

Volatile具有的特性

  • 可见性
  • 顺序性
  • 没有原子性

 

 

正确使用Volatile

 

  • 对变量的写操作不依赖当前值;不能做线程安全计数器,i++,其实步骤是:读取 - 修改 - 写入,对于不支持原子性的Volatile是不安全的
  • 该变量没有包含在具有其他变量的不变式中

 

 

Volatile性能开销

 

  • 读操作开销非常低,几乎和非Volatile读操作一样
  • 写操作开销比非Volatile写操作多很多
  • Volatile总开销俾Synchronized低

注意:在Volatile安全使用的情况下,Volatile的可伸缩性强,如读操作远超过写操作,对比锁,可降低性能开销

 

 

 

Volatile适用场景

 

  • 不能做线程计数器
  • 状态标志
  • 一次性安全发布
  • 独立观察
  • Volatile bean模式
  • 开销低的读写策略

volatile不能保证原子性而Atomic可以,例如:AtomicLong

 

 

 

猜你喜欢

转载自youyu4.iteye.com/blog/2351410