我正在考虑编写一个看起来像这样的单例框架:
Object getSingleton(name) {
synchronized(A)
{
o = A.get(name)
if (o != null)
{
while ( ! A.isInitialized(name) )
{
A.wait()
}
return o;
}
o = new Thing();
A.put(o)
A.setInitialized(name, false)
}
o.init()
synchronized(A)
{
A.setInitialized(name, true)
A.notifyAll()
}
return o;
}
关键是允许 o.init() 与可能想要调用 getSingleton() 的其他线程交互,并且不会导致 A 上的死锁。
这会按我想要的方式工作,还是 o.init() 可以相对于同步块重新排序?还是有更好的方法来做到这一点?