volatile作用、优缺点、原理

参数书籍:《Java性能优化权威指南》、《Java并发编程实战》

作用:

    volatile字段值在 所有的线程 和 CPU缓存中必须保持同步。(参考Java内存模型)

    简单讲,你读取的volatile字段必然是上次写入的,而无关乎那个线程写入的。


线程安全:

    线程安全考虑 可见性、原子性。volatile字段本身保证了可见性,但我们编程时 仍要保证原子性,如下伪码。

if(volatile no exist) 

    then new volatile.
  1. if的判断volatile保证当时确实正确,然后线程a可能睡着了,
  2. 线程b也判断不存在,b线程就new了一个。
  3. 然后a线程wake up,据需执行new volatile。

就有了两个volatile的对象,原因就是因为你的程序 没有保证原子性。需要你对 if--》create这个过程加锁,保证这是原子性不可分割的操作。


实现原理:

    CPU缓存中的volatile字段被一个线程修改后,其他CPU缓存中的线程在读 本地CPU缓存的 volatile字段时,就必须读取更新过的字段。

    具体是  在出现volatile字段的地方加入一条CPU指令:内存屏障(通常称为membar后fence),一旦volatile字段变化,就会触发CPU缓存更新


缺点:
  1. 频繁更改、改变或写入volatile字段 有可能导致性能为题。(读取volatile字段时没有性能问题的)
  2. 限制现代JVM的JIT编译器对这个字段优化(volatile字段必须遵守一定顺序,但这也是优点,或者说是特点吧!本来就是要保证happen-before,放置顺序指令重拍导致bug 例如单例双检测bug)
解决办法:
  1. 减少对volatile的写操作
  2. 重构避免使用volatile



你可能感兴趣的:(java,多线程)