根据the Java Language Specification的说法,构造函数不能被标记为已同步,因为在创建对象的线程完成它之前,其他线程无法看到正在创建的对象。这看起来有点奇怪,因为我确实可以让另一个线程在构造对象时查看它:
public class Test {
public Test() {
final Test me = this;
new Thread() {
@Override
public void run() {
// ... Reference 'me,' the object being constructed
}
}.start();
}
}
我知道这是一个相当做作的例子,但在理论上,似乎有人可以想出一个更现实的情况,将构造函数标记为同步是合法的,以防止像这样的线程竞争。
我的问题是:有没有理由让Java明确禁止构造函数上的synchronized修饰符?也许我上面的例子是有缺陷的,或者可能真的没有原因,这是一个武断的设计决定。不管是哪种情况,我都很好奇,很想知道答案。
https://stackoverflow.com/questions/4880168
复制相似问题