你知道为什么这个构造函数会无限期挂起吗?我正在尝试创建一个线程安全的单例。
private RWLockedSingleton() {
lock.writeLock().lock();
System.out.println("we're done!");
isComplete = true;
lock.writeLock().unlock();
}发布于 2012-06-18 22:40:21
锁定构造函数几乎总是不正确的。您有一个很好的理由不能将synchronized添加到构造函数中。您应该锁定调用构造函数的方法。
如果您持有writeLock(),即使它在同一线程中,您也可以让readLock()永远等待。
创建延迟加载的、线程安全的单例最简单、通常也是最有效的方法是使用enum
enum Singleton {
INSTANCE;
}发布于 2012-06-18 22:39:07
我刚刚注意到,在静态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;
};https://stackoverflow.com/questions/11085035
复制相似问题