java - x86/x64 架构是否可以抵抗不安全的发布?

标签 java multithreading cpu

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

相关文章:

java - 有人可以解释一下此Java代码有什么问题吗?

java - 如何从自定义 ArrayList 中获取特定条目?

c++ - 多线程包装器

c++ - 多线程可以访问同一个weak_ptr对象C++

c# - 异步等待新线程的行为

java - Spring - 使用@Service和@Repository注释同一个类

SSLSocket 创建时的 Java 异常

performance - 是什么让 GPU 在神经网络计算中如此高效?

linux - pcpu 表示什么以及为什么乘以 1000?

memory - 如何在 Chrome 中打开许多选项卡但卸载/禁用非事件/非当前选项卡,释放内存和 CPU?