我刚读过 http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html?page=5它说:
the compiler is free to assign a value to the singleton member variable before the singleton's constructor is called
请问是不是打错了。他们真的真的想说:JVM 的实现是免费的而不是编译器是免费的。
我的第二个问题是 C#/VB 也有这个问题吗? (其中“编译器”可以自由地为变量赋值,甚至在变量完全启动之前/甚至在变量类的构造函数完全运行之前。
最佳答案
在Java中,为对象分配内存和调用构造函数是两个独立的操作。例如,类似
Object o = new Object();
编译成这些字节码:
0: new #2; //class java/lang/Object
3: dup
4: invokespecial #1; //Method java/lang/Object."<init>":()V
7: astore_1
在指令 0 之后,对已分配但未构造的对象的引用位于堆栈上。直到偏移量 4 才调用构造函数。绝对没有什么可以阻止编译器将该引用分配给它想要的任何变量,包括静态成员。因此,这篇文章是正确的。
我不知道 CLR 字节码,但我想它与 JVM 的指令集相当接近,而且我猜想该运行时也会存在与线程相关的相同类型的警告。它当然适用于 native 代码编译器。
关于c# - 编译器可以在变量实际启动之前为变量赋值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5944601/