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