提问者:小点点

重写锁挂起


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

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

BTW,我意识到将锁放在静态getter中可能更好;我只是想知道在构造函数中使用锁是否本质上是错误的


共2个答案

匿名用户

IMHO锁定构造函数几乎总是不正确的。您有充分的理由不能将同步添加到构造函数中。您应该锁定调用构造函数的方法。

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

创建惰性加载、线程安全单例的最简单且通常最有效的方法是使用枚举

enum Singleton {
    INSTANCE;
}

匿名用户

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

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

public static RWLockedSingleton getSingleton() {
    lock.readLock().lock();
    RWLockedSingleton ref = null;
    if (singleton == null) {
        singleton = new RWLockedSingleton();
        ref = singleton;
    }
    lock.readLock().unlock();
    return ref;
};