(在有关构造函数和对象发布的JLS中)没有矛盾吗?
我相信这些是不矛盾的稍微不同的问题。
JLS引用是关于将对象引用存储在构造函数完成之前 其他线程
可以看到它的地方。例如,在构造函数中,您不应将对象放入
static其他线程使用的字段中,也不应分叉线程。
public class FinalFieldExample { public FinalFieldExample() { ... // very bad idea because the constructor may not have finished FinalFieldExample.f = this; ... } }
您也不应该在构造函数中启动线程:
// obviously we should implement Runnable here public class MyThread extends Thread { public MyThread() { ... // very bad idea because the constructor may not have finished this.start(); } }
即使您所有的字段都
final在一个类中,在构造函数完成之前将对象的引用共享给另一个线程也不能保证在其他线程开始使用该对象时已经设置了这些字段。
我的答案是关于在构造函数完成后使用不同步的对象。尽管在构造函数,缺乏同步性以及编译器对 *** 作的重新排序方面相似,但这是一个略有不同的问题。
在JLS 17.5-1中,它们 不在 构造函数内部分配静态字段。他们用另一种静态方法分配静态字段:
static void writer() { f = new FinalFieldExample();}
这是关键的区别。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)