使重入锁成为静态并使其成为互斥锁吗?

2022-09-04 07:28:14

在 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();
}

提前感谢大家。马 特


答案 1

是的。

final当然,它们没有影响力,但意味着所有实例都共享相同的锁。privatestatic

因此,如果您有两个实例,则代码块不能由两个线程同时执行。

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


答案 2

创建静态锁等效于

synchronized(MyClass.class){

}

它本质上是一个类级锁


推荐