0

我正在考虑编写一个看起来像这样的单例框架:

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() 可以相对于同步块重新排序?还是有更好的方法来做到这一点?

4

1 回答 1

0

使用 Apache.org 的LazyInitializerclass,听起来就像你所需要的。

于 2013-06-19T16:26:52.810 回答