Lock
представляют высокоуровневую альтернативу блока synchronized
, то реализации его спутника, интерфейса Condition
– альтернатива методам notify/wait. Оба этих интерфейса относятся к пакету java.util.concurrent.locks
.Как и ожидание на мониторе,
Condition
реализует примитив синхронизации «Условная переменная». Один или несколько потоков зависают на объекте-кондишне с помощью варианта метода await
(ждут удовлетворения условия). Другой поток пробуждает их методами signal
и signalAll
(сигнализирует об удовлетворении условия).Конкретные реализации
Condition
всегда решают те же задачи, что блокировка на мониторе, но в теории могут отличаться в нюансах поведения. Например, может не быть требования вызывать ожидание/сигнал только при захваченном локе (аналог требования, по которому notify
/wait
всегда вызываются в synchronized
). Или может гарантироваться порядок получения сигнала ожидающими потоками.Возвращаясь к поставленному вопросу,
Condition
всегда связан со своим объектом типа Lock
, и метод Lock.newCondition()
– единственный правильный способ создания кондишна.