某个地方的人告诉我Java构造函数是同步的,因此在构造过程中不能同时访问它,而我在想:是否有构造函数将对象存储在映射中,而另一个线程在构造之前从该映射检索它完成后,该线程是否会阻塞,直到构造函数完成?
让我用一些代码演示:
public class Test {
private static final Map testsById =
Collections.synchronizedMap(new HashMap<>());
private static final AtomicInteger atomicIdGenerator = new AtomicInteger();
private final int id;
public Test() {
this.id = atomicIdGenerator.getAndIncrement();
testsById.put(this.id, this);
// Some lengthy operation to fully initialize this object
}
public static Test getTestById(int id) {
return testsById.get(id);
}
}
假设put / get是地图上唯一的操作,因此我不会通过迭代之类的方法来获取CME,并尝试在此忽略其他明显的缺陷。
我想知道的是,如果另一个线程(显然不是构造该对象的线程)试图使用getTestById并调用对象来访问该对象,它将阻塞吗?换一种说法:
Test test = getTestById(someId);
test.doSomething(); // Does this line block until the constructor is done?
我只是想弄清楚构造函数同步在Java中进行的程度,以及类似的代码是否有问题。我最近看到这样的代码而不是使用静态工厂方法来执行此操作,并且我想知道在多线程系统中这样做有多危险(或安全)。