我观察到,在 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/