围绕同步块重新排序代码

时间:2013-06-19 16:25:26

标签: java multithreading

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

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()?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

使用Apache.org的LazyInitializer class,听起来就像你需要的一样。