我正在考虑编写一个看起来像这样的单例框架:
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()?或者有更好的方法吗?