5

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

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

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

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

4

2 回答 2

1

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

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

同步 - 它完全是一个不同的巨人。它保证了原子性以及重新排序和可见性。为了实现原子性,它必须做很多簿记。

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

于 2014-02-04T03:33:36.673 回答
1

“费用”是因为它每次都从内存中读取,而不是可能使用内存缓存。这不是很多,至少在 x86 机器上

于 2014-02-04T01:55:11.273 回答