1

知道为什么这个构造函数无限期挂起吗?我正在尝试创建一个线程安全的单例。

private RWLockedSingleton() {
    lock.writeLock().lock();
    System.out.println("we're done!");
    isComplete = true;
    lock.writeLock().unlock();
}

顺便说一句,我意识到将锁放在静态吸气剂中可能会更好;我只是想知道在构造函数中使用锁是否本质上是错误的

4

2 回答 2

3

恕我直言,锁定构造函数几乎总是不正确的。您不能添加synchronized到构造函数中是有充分理由的。您应该锁定调用构造函数的方法。

如果你持有 readLock(),你可以让 writeLock() 永远等待,即使它在同一个线程中。

创建延迟加载的线程安全单例的最简单且通常最有效的方法是使用enum

enum Singleton {
    INSTANCE;
}
于 2012-06-18T14:40:21.080 回答
0

刚刚注意到,在静态 getter 中,我在放入构造函数之前获得了 lock.readLock 上的锁。

根据 JavaDoc,如果线程具有读锁,则不允许升级为写锁。我本来预计会出现异常或错误,但在 readLock 解锁之前停止线程可能是有效的用途。作为参考,如果构造函数尝试获取 writeLock,则以下内容将不起作用

public static RWLockedSingleton getSingleton() {
    lock.readLock().lock();
    RWLockedSingleton ref = null;
    if (singleton == null) {
        singleton = new RWLockedSingleton();
        ref = singleton;
    }
    lock.readLock().unlock();
    return ref;
};
于 2012-06-18T14:39:07.320 回答