gpt4 book ai didi

Java内存模型: compiler rearranging code lines

转载 作者:IT王子 更新时间:2023-10-28 23:37:12 26 4
gpt4 key购买 nike

众所周知,Java 语言允许编译器重新排列已编译代码的行,只要重新排序对代码语义没有影响。然而,编译器只需要关心从当前线程中看到的语义。如果这种重新排序在多线程情况下影响语义,通常会导致并发问题(内存可见性)

我的问题:

  1. 允许编译器释放这个 freedm 可以实现什么?编译器真的有可能通过重新排列代码来生成更高效的代码吗?我还没有看到一个实际的案例。有时我觉得这样做带来的并发风险远远超过了好处。

  2. 程序员有什么办法可以告诉编译器不要像这样重新排列行吗?我知道使用同步原语可以有效地处理重新排列的副作用,但我想问是否有任何直接的方法(编译器选项)来关闭它?

最佳答案

javac 编译器几乎没有进行任何优化。

JIT native 编译器可以在存在内存排序问题的情况下重新排序指令。但是,CPU 也可以重新排序指令和内存更新,具有相同的效果。

What is achieved by allowing this freedm to the compiler ?

主要好处是代码可移植性。您提供的保证越多,就越难以确保每个平台都真正做到这一点。

通过允许 CPU 尽可能地而不是按照严格的顺序执行指令,还可以显着提高性能。

Is it really possible for the compiler to produce code which is more efficient by rearranging the code ?

是的。但 CPU 进行的重新排序更为重要。

I am yet to see a practical case for this. I feel sometimes that the benefits if any are far outweighed by the concurrency risks this can introduce.

Is there any way that programmer can tell compiler not to rearrange lines like this ?

这就是您使用 volatilesynchronized block 和 Lock 等内存屏障的原因。当您使用这些时,您将获得线程安全保证。

I know that using synchronization primitives effectively handles the side-effects of rearranging , but I am asking if there is any direct way ( compiler option ) to turn this off ?

您可以关闭 JIT,但大多数重新排序是由 CPU 完成的,因此效果不大。

避免重新排序更新只是线程安全问题的一小部分(其最大的问题是晦涩难懂且很少发生,这使得测试变得困难)一旦编写线程安全代码,这种情况就会得到缓解。

关于Java内存模型: compiler rearranging code lines,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8742333/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com