我观察到,在 JVM 1.5+ 中不安全的对象发布不太可能导致任何问题,无论 JVM 规范是否声明不能保证此类对象在线程之间可见。
在互联网上环顾四周时,我发现了这一点:http://forum.springsource.org/archive/index.php/t-60676.html 昵称“ al0 ”的人声称,“[...] 在基于 x86/x64 的机器上不太可能遇到这种行为,但在 HP PA-RISC 上或基于 IBM Power... 的计算机(例如 AS400)更有可能”。
x86/x64 架构是否能抵抗不安全的发布?怎么来的?
最佳答案
x86 处理器在某种程度上抵抗不安全的发布。特别是,只要一个线程仅写入共享内存而另一个线程仅读取,处理器就会将所有加载和存储视为内存位置具有 Java volatile
语义。写入永远不会在写入之后重新排序,而读取永远不会在读取之后重新排序,因此读取线程总是以正确的顺序看到写入
然而:
volatile
仍然比 x86 promise 的要强 x.b = 4; y.a = 5;
重写为 y.a = 4; x.b = 5
。 可以基于许多不同的因素做出这样的决定:选择代码的哪些部分将被 JIT 编译、内联、调度……所以即使在具有强内存排序的处理器上,不安全的发布仍然是不安全的。
关于java - x86/x64 架构是否能抵抗不安全的发布?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18511152/