有人告诉我,使用 volatile 变量比使用同步块(读取或写入)时使用它更有效。
直到 Java 1.4 我才明白为什么(因为那时线程不必刷新和刷新所有可访问的内存)。
但是从 Java 1.5 开始,我发现使用 volatile 变量和同步块之间的唯一区别是锁获取机制。
买锁真的那么贵吗?如果是这样,那是为什么呢?
有人告诉我,使用 volatile 变量比使用同步块(读取或写入)时使用它更有效。
直到 Java 1.4 我才明白为什么(因为那时线程不必刷新和刷新所有可访问的内存)。
但是从 Java 1.5 开始,我发现使用 volatile 变量和同步块之间的唯一区别是锁获取机制。
买锁真的那么贵吗?如果是这样,那是为什么呢?
volatile 变量和同步是不同的同步工具。比较它们的性能也不理想。
Volatile - http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.5 - 在某种程度上它可以解决变量的可见性和重新排序等问题指示。
同步 - 它完全是一个不同的巨人。它保证了原子性以及重新排序和可见性。为了实现原子性,它必须做很多簿记。
因此,同步是昂贵的,然后读取或写入 volatile 变量。公平地说,你应该比较不同的同步机制和不同类型的锁,即ReaderWriterLock、StampedLock,还应该研究一下CompareAndSwap,它是一个很好的读物。
“费用”是因为它每次都从内存中读取,而不是可能使用内存缓存。这不是很多,至少在 x86 机器上。