首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReentrantReadWriteLock挂起

ReentrantReadWriteLock挂起
EN

Stack Overflow用户
提问于 2012-06-18 22:31:55
回答 2查看 911关注 0票数 1

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

代码语言:javascript
复制
private RWLockedSingleton() {
    lock.writeLock().lock();
    System.out.println("we're done!");
    isComplete = true;
    lock.writeLock().unlock();
}
EN

回答 2

Stack Overflow用户

发布于 2012-06-18 22:40:21

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

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

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

代码语言:javascript
复制
enum Singleton {
    INSTANCE;
}
票数 3
EN

Stack Overflow用户

发布于 2012-06-18 22:39:07

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

根据JavaDoc的说法,如果线程具有读锁,则不允许将其升级为写锁。我预计会出现异常或错误,但是在readLock解锁之前暂停线程可能有一些合理的用法。作为参考,如果构造函数尝试获取writeLock,则以下代码将不起作用

代码语言:javascript
复制
public static RWLockedSingleton getSingleton() {
    lock.readLock().lock();
    RWLockedSingleton ref = null;
    if (singleton == null) {
        singleton = new RWLockedSingleton();
        ref = singleton;
    }
    lock.readLock().unlock();
    return ref;
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11085035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档