Относительно нескольких попыток блокировки, используя java.concurrent.ReentrantLock - PullRequest
3 голосов
/ 08 марта 2012

Я заметил, что следующий блок кода:

    final Lock s = new ReentrantLock();
    for(int i = 0 ; i < 1000 ; i++)
    {
        s.lock();
        System.out.println(i+" :" +s.tryLock()+" ");
    }

Отпечатки:

0 :true 
1 :true 
2 :true 
3 :true 
...

Это странно - я бы ожидал, что последовательные блокировки потерпят неудачу, поскольку s никогда не разблокируется.

Здесь есть какие-нибудь происшествия?

Ответы [ 4 ]

10 голосов
/ 08 марта 2012

Javadoc - твой друг .Вы действительно должны читать это.

From: ReentrantLock.lock ()

Если текущий поток уже удерживает блокировку, то счетчик удержаний увеличивается на единицу, и метод немедленно возвращается.

6 голосов
/ 08 марта 2012

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

ReentrantLock принадлежит потоку, который последний раз успешно блокировал,но еще не разблокировал его.Поток, вызывающий блокировку, вернется, успешно получив блокировку, когда блокировка не принадлежит другому потоку.Метод вернется немедленно, если текущий поток уже владеет блокировкой.Это можно проверить с помощью методов isHeldByCurrentThread () и getHoldCount ().

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html

5 голосов
/ 08 марта 2012

ReentrantLock - это специально , разработанная так, чтобы один и тот же поток мог получить блокировку более одного раза. Вот что значит «реентерабельный». Это должно было продемонстрировать это поведение с самого начала.

0 голосов
/ 23 февраля 2017

Он всегда возвращает true, потому что существует только один поток, и если thread1 находит s.lock () или s.tryLock () , он будетпросто увеличьте счетчик удержаний, и если другой поток попытается выполнить этот код, метод s.tryLock () вернет false, поскольку блокировка получается thread1 .

...