【问题标题】:Why is volatile variable much more efficient than plain synchronization为什么 volatile 变量比普通同步更有效
【发布时间】:2014-02-04 01:50:59
【问题描述】:

有人告诉我,无论何时使用 volatile 变量(读取或写入),使用 volatile 变量都比使用同步块更有效。

直到 Java 1.4 我才明白为什么(因为那时线程不必刷新和刷新所有可访问的内存)。

但是从 Java 1.5 开始,我看到使用 volatile 变量和同步块之间的唯一区别 - 是锁获取机制。

获取锁真的那么贵吗?如果是这样,为什么会这样?

【问题讨论】:

    标签: java multithreading concurrency volatile java-memory-model


    【解决方案1】:

    “费用”是因为它每次都从内存中读取,而不是可能使用内存缓存。是not a lot, at least on x86 machines。

    【讨论】:

    • 但是在 Java 1.5 及更高版本上使用 volatile 时,它​​每次都会从内存中读取,不是吗?
    • 内存模型早先被“破坏”了:cs.umd.edu/users/pugh/java/memoryModel/…
    • 我还是不明白。据我了解,关于可见性,同步和 volatile 是相似的(在 Java >= 1.5 上)。那么除了获取锁之外,它们之间还有什么区别呢?如果是的话,为什么这么贵??
    • 另一个原因:每当您获取/释放锁/监视器时,同步会导致相关 CPU 缓存的刷新。 volatile 没有这样做,因为它没有保存在缓存中。
    • 在新的 JMM 下,对 volatile 变量的读写操作确实会导致内存刷新重新加载。 ibm.com/developerworks/library/j-jtp03304
    【解决方案2】:

    volatile 变量和同步是不同的同步工具。 比较它们的性能也不理想。

    挥发性 - http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.5 - 在某种程度上,它可以解决变量可见性和指令重新排序等问题。

    同步 - 它完全是一个不同的巨人。它保证原子性以及采取 关心重新排序和可见性。为了实现原子性,它必须做大量的簿记工作。

    因此同步是昂贵的然后读取或写入 volatile 变量。 公平地说,您应该比较不同的同步机制和不同的类型 锁,即ReaderWriterLock,StampedLock,还研究了CompareAndSwap,它是一个很好的阅读。

    【讨论】:

      猜你喜欢
      • 2011-06-19
      • 2016-05-30
      • 1970-01-01
      • 2014-03-03
      • 2012-07-18
      • 2011-08-30
      • 2014-01-21
      • 2012-03-07
      • 2013-08-10
      相关资源
      最近更新 更多