Первое, что запускается, это вызовы T1 resource.a()
. Теперь, скажем, resource.a()
занимает 1500 минут, если T2 звонит resource.b()
в течение 100-й минуты (что означает, что звонок от T1 выполняется), что происходит?
Что происходит, так это то, что T2 блокируется, пока вызов T1 на resource.b()
не снимет блокировку. В этом случае он будет заблокирован на 1400 минут.
Когда я выполнил lock.lock()
, он заблокировал объект или заблокировал метод?
Не совсем.
Вы не заблокировали Resource
экземпляр:
- Экземпляр
Resource
имеет встроенную блокировку , которая здесь не используется.
- Другие темы, вызывающие
resource.c()
, не будут заблокированы.
Вы на самом деле не блокировали методы. Блокировка внутри методов. Так, например, метод a
или метод b
могут делать вещи до вызова lock.lock()
или после его освобождения.
Что вы на самом деле сделали, так это то, что приобрели блокировку объекта ReentrantLock
.
В этом случае два из трех методов используют , которые блокируют объект, таким образом, вы в действительности блокируете соответствующих частей этих методов для вызовов различными потоки.
Однако, если вызовы были сделаны одним и тем же потоком (например, если a()
вызывается b()
), то второй вызов не будет заблокирован. (Вот что означает «реентерабельный» в этом контексте.)