12

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

谢谢大家。马特

4

2 回答 2

22

是的。

final并且private没有影响,当然,但static意味着所有实例共享相同的锁。

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

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

于 2011-04-15T15:12:54.240 回答
4

创建静态锁等效于

synchronized(MyClass.class){

}

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

于 2011-04-15T15:13:01.343 回答