我被告知使用volatile变量比使用synchronized(读或写)时使用synchronized块更有效。
直到Java 1.4我才能明白为什么(因为那时线程不必刷新并刷新所有可访问的内存)。
但是,由于Java 1.5,我在使用volatile变量和synchronized块之间看到的唯一区别是锁获取机制。
获得锁真的那么贵吗?如果是这样,那为什么呢?
答案 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,这是一个很好的阅读。