知道为什么这个构造函数无限期挂起吗?我正在尝试创建一个线程安全的单例。
private RWLockedSingleton() {
lock.writeLock().lock();
System.out.println("we're done!");
isComplete = true;
lock.writeLock().unlock();
}
顺便说一句,我意识到将锁放在静态吸气剂中可能会更好;我只是想知道在构造函数中使用锁是否本质上是错误的
知道为什么这个构造函数无限期挂起吗?我正在尝试创建一个线程安全的单例。
private RWLockedSingleton() {
lock.writeLock().lock();
System.out.println("we're done!");
isComplete = true;
lock.writeLock().unlock();
}
顺便说一句,我意识到将锁放在静态吸气剂中可能会更好;我只是想知道在构造函数中使用锁是否本质上是错误的
恕我直言,锁定构造函数几乎总是不正确的。您不能添加synchronized
到构造函数中是有充分理由的。您应该锁定调用构造函数的方法。
如果你持有 readLock(),你可以让 writeLock() 永远等待,即使它在同一个线程中。
创建延迟加载的线程安全单例的最简单且通常最有效的方法是使用enum
enum Singleton {
INSTANCE;
}
刚刚注意到,在静态 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;
};