我刚刚阅读了 http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html?page=5,它说:



我想知道它是否是一个错字。他们真的真的想说: JVM 的实现是自由的 而不是 编译器是自由的

我的第二个问题是 C#/VB 也有这个问题吗? (其中“编译器”甚至在变量完全启动之前/甚至在变量类的构造函数完全运行之前就可以自由地为变量赋值。

最佳答案

问题的第一部分的答案是您是正确的,尽管这更像是一个草率的术语,而不是拼写错误或错误。 (显然,编译器不会为变量赋值……这只发生在编译器生成的代码被执行时。)

技术上更准确的重述是:

“...因为编译器可以自由生成代码,这些代码可能会导致在调用单例的构造函数之前将值写入内存中的单例成员变量,并且构造的对象已刷新到内存中。”

这种事情最有可能发生在 native 代码编译器级别,当编译器(合法)重新排序指令时,或者只是作为内存流水线的结果。 Java 内存模型特别允许这样做,以便编译器能够生成在多核机器上运行得更快的代码。 (另一方面是您的多线程代码必须以所需的方式同步,否则它很可能不可靠。)

(理论上,字节码编译器也可以对字节码进行重新排序,但很有可能不会。字节码编译器进行细粒度优化的值(value)很小。实际上,这可能是有害的,因为它可能会使它变得更难对于 JIT 编译器的优化器。)

我将把 C# 和 VB 案例留给熟悉这些语言规范的人。

关于c# - 编译器是否可以在变量实际启动之前为变量赋值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5944601/

10-10 21:55
查看更多