为什么volatile变量比普通同步更有效

时间:2014-02-04 01:50:59

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

我被告知使用volatile变量比使用synchronized(读或写)时使用synchronized块更有效。

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

但是,由于Java 1.5,我在使用volatile变量和synchronized块之间看到的唯一区别是锁获取机制。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

volatile变量和同步是用于同步的不同工具。 它也不是比较这些性能的理想选择。

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

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

因此,同步读取或写入易失性变量的成本很高。 公平地说,你应该比较不同的同步机制和不同的类型 锁,即ReaderWriterLock,StampedLock,也研究了CompareAndSwap,这是一个很好的阅读。