任何想法为什么这个构造函数无限期挂起?我正在尝试创建一个线程安全的单例。
private RWLockedSingleton() {
lock.writeLock().lock();
System.out.println("we're done!");
isComplete = true;
lock.writeLock().unlock();
}
顺便说一句,我意识到把锁放在静电吸气器中可能会更好;我只是想知道在构造函数中使用锁是否本质上是错误的
答案 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;
};