Делает ли Reentrant Lock статичным и делает его мьютексом? - PullRequest
10 голосов
/ 15 апреля 2011

В книге Брайана Гетца «Параллелизм Java на практике» его пример блокировки «Reentrant» запрограммирован так:

Lock lock = new ReentrantLock();

Однако мне любопытно узнать, изменив ли код выше:

private static final Lock lock = new ReentrantLock();

заставляет блокировку теперь действовать как мьютекс или если она не нужна и избыточна.

Таким образом, изменяется ли функциональность этого кода, если блокировка сделана закрытой, статической и окончательной?

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

Спасибо всем заранее. Мэтт

Ответы [ 2 ]

18 голосов
/ 15 апреля 2011

Да.

final и private, конечно, не имеют никакого влияния, но static означает, что все экземпляры имеют одинаковую блокировку.

Таким образом, если у вас есть два экземпляра, блок кода не может быть выполнен двумя потоками одновременно.

Если блокировка не является статической, каждый экземпляр получает свою собственную блокировку. Это означает, что большее количество потоков может выполнять код одновременно (конечно, в зависимости от того, на каком экземпляре они работают).

3 голосов
/ 15 апреля 2011

Создание статического замка эквивалентно

synchronized(MyClass.class){

}

По сути, это замок на уровне класса

...