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

Java 为什么volatile变量比普通同步更有效,java,multithreading,concurrency,volatile,java-memory-model,Java,Multithreading,Concurrency,Volatile,Java Memory Model,有人告诉我,无论何时使用(读或写),使用volatile变量都比使用同步块有效得多 直到Java1.4,我才明白为什么(因为那时线程不必刷新所有可访问的内存) 但是自从Java1.5以来,我看到的使用volatile变量和同步块之间的唯一区别是锁获取机制 获得锁真的那么贵吗?如果是的话,为什么会这样?这个“费用”是因为它每次都从内存中读取数据,而不是可能使用内存缓存。是的。可变变量和同步是不同的同步工具。 比较这些设备的性能也不理想 挥发性- -在某种程度上,它可以解决变量的可见性和指令的重新排

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

直到Java1.4,我才明白为什么(因为那时线程不必刷新所有可访问的内存)

但是自从Java1.5以来,我看到的使用volatile变量和同步块之间的唯一区别是锁获取机制


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

这个“费用”是因为它每次都从内存中读取数据,而不是可能使用内存缓存。是的。

可变变量和同步是不同的同步工具。 比较这些设备的性能也不理想

挥发性- -在某种程度上,它可以解决变量的可见性和指令的重新排序等问题

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

因此,同步比读取或写入易失性变量更昂贵。 为了公平起见,您应该比较不同的同步机制和不同的类型
关于锁,例如ReaderWriterLock、StampedLock,也研究了CompareAndSwap。这是一个很好的读物。

但是每次在Java 1.5或更高版本上使用volatile时,它都会从内存中读取,不是吗?内存模型之前已经“损坏”:我仍然不明白。据我所知,就可见性而言,同步和volatile是相似的(在Java上>=1.5)。那么,除了锁获取之外,它们之间还有什么区别呢?如果是这样的话,为什么它会很昂贵呢?另一个原因是:同步会导致在获取/释放锁/监视器时刷新相关的CPU缓存。volatile不会这样做,因为它不保存在缓存中。在新的JMM下,从volatile变量读写会导致内存刷新重新加载。