ReentrantReadWriteLock挂起

时间:2012-06-18 14:31:55

标签: java java.util.concurrent reentrantreadwritelock

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

private RWLockedSingleton() {
    lock.writeLock().lock();
    System.out.println("we're done!");
    isComplete = true;
    lock.writeLock().unlock();
}
顺便说一句,我意识到把锁放在静电吸气器中可能会更好;我只是想知道在构造函数中使用锁是否本质上是错误的

2 个答案:

答案 0 :(得分:3)

恕我直言锁定构造函数几乎总是不正确的。有一个很好的理由你不能将synchronized添加到构造函数中。你应该锁定调用构造函数的方法。

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

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

enum Singleton {
    INSTANCE;
}

答案 1 :(得分: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;
};