【问题标题】:Does making a Reentrant Lock static and make it a mutex?是否将可重入锁设为静态并使其成为互斥锁?
【发布时间】:2011-08-06 10:19:47
【问题描述】:

在 Brian Goetz 的《Java Concurrency in Practice》一书中,他的可重入锁示例是这样编写的:

Lock lock = new ReentrantLock();

但是,我很想知道是否将上面的代码更改为:

private static final Lock lock = new ReentrantLock();

使锁现在充当互斥锁,或者如果它是不必要和多余的。

因此,如果锁是私有的、静态的和最终的,这段代码的功能会改变吗?

lock.lock();
try {
    //method stuff
} finally {
    lock.unlock();
}

提前谢谢大家。 马特

【问题讨论】:

    标签: java locking mutex reentrantlock


    【解决方案1】:

    是的。

    finalprivate 当然没有影响,但static 表示所有实例共享同一个锁。

    所以如果你有两个实例,代码块不能同时被两个线程执行。

    如果锁不是静态的,每个实例都有自己的锁。这意味着更多线程可以同时运行代码(当然取决于它们工作的实例)。

    【讨论】:

    • 另请参阅ibm.com/developerworks/java/library/j-jtp10264,了解有关锁与 synchronized 关键字的更多信息。
    • 很抱歉把这篇文章从地下挖出来,但我现在正在寻找这个主题。如果创建private static final ReentrantLock lock 不被视为代码气味,我很感兴趣?我读过静态变量是邪恶的,但我目前正在处理的用例看起来像是使用它的理想场所。愿意帮忙吗?
    • @Bobzone 我建议提出一个新问题。如果我在这里回答,只有极少数人能够找到它。
    • @AaronDigulla 按照建议创建了此线程:stackoverflow.com/questions/47722200/…
    【解决方案2】:

    创建一个静态锁相当于

    synchronized(MyClass.class){
    
    }
    

    它本质上是一个类级别的锁

    【讨论】:

    • 不完全是。该类是公共的,任何调用者都可以执行锁定。指定的可重入锁是私有的,因此只有类可以访问该锁。
    • 您假设该类是公共的,而不是子类、私有的、受保护的或受包保护的。不过,我的回答更多是为了展示锁和类之间的关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2011-01-28
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多