来自《Effective Java》一书:
虽然 volatile 修饰符不执行互斥,但它保证任何读取该字段的线程都会看到最近写入的值
SO和许多其他来源声称类似的事情。
这是真的?
我的意思是真的,不是一个足够接近的模型,或者只在 x86 上,或者只在 Oracle JVM 中,或者“最近写的”的一些定义,这不是标准的英语解释......
其他来源(SO 示例)说 Java 中的 volatile 就像 C++ 中的获取/释放语义。我认为不提供报价的保证。
我发现在JLS 17.4.4 中它说“对 volatile 变量 v 的写入(第 8.3.1.4 节)与任何线程对 v 的所有后续读取同步(其中“后续”是根据同步顺序定义的)。 ” 但我不太明白。
有很多支持和反对的消息来源,所以我希望答案能够说服其中许多(在任何一方)确实是错误的 - 例如参考或规范,或反示例代码。