Применяет ли объект Java Lock отношение «происходит до»?

Java предоставляет объект Lock в пакете параллелизма, который согласно документации provides more extensive locking operations than can be obtained using synchronized methods and statements.

Синхронизированные методы/блоки, помимо взаимного исключения, обеспечивают связь «происходит до», которая гарантирует, что изменения, внесенные в переменную одним потоком, видны другому.

Возникает ли эта связь при использовании объекта блокировки? Гарантируется ли наблюдение, как в случае с синхронизированным блоком, для всех платформ?


person Petrakeas    schedule 30.09.2015    source источник


Ответы (2)


Возникает ли эта связь при использовании объекта блокировки? Гарантируется ли наблюдение, как в случае с синхронизированным блоком, для всех платформ?

Да, это так.

Существует несколько действий, которые создают отношения «происходит до», и одно из них — синхронизация (здесь), и объект блокировки Java также предназначен для этой цели.

Прочтите о свойствах непротиворечивости памяти в Java из документации Oracle. За исключением ниже, которые будут выделены в ссылке.

Ниже "расширить эти гарантии" означает свойства согласованности памяти, такие как отношения "происходит до". Класс Lock принадлежит подпакету java.util.concurrent, поэтому он гарантирует свойства согласованности памяти, такие как отношения «происходит до» и многое другое.

Методы всех классов в java.util.concurrent и его подпакетах распространяют эти гарантии на синхронизацию более высокого уровня.

person hagrawal    schedule 30.09.2015
comment
Кроме того, в документе «Свойства согласованности памяти» явно указано: «Действия перед выпуском методов синхронизатора, таких как Lock.unlock, Semaphore.release и CountDownLatch.countDown, происходят до действий, следующих за успешным методом получения, таких как Lock.lock, Semaphore.acquire, Condition». .await и CountDownLatch.await для одного и того же объекта синхронизатора в другом потоке. - person Petrakeas; 30.09.2015
comment
Да, это одна из лучших страниц, где можно прочитать о том, почему, как и что находится внутри пакета java.util.concurrent. - person hagrawal; 30.09.2015

Да, это так.

Объекты блокировки работают так же, как неявные блокировки, используемые синхронизированным кодом. Как и в случае с неявными блокировками, только один поток может одновременно владеть объектом блокировки. Объекты блокировки также поддерживают механизм ожидания/уведомления через связанные с ними объекты Condition.

Из https://docs.oracle.com/javase/tutorial/essential/concurrency/newlocks.html

person Andres    schedule 30.09.2015
comment
Все, что вы здесь говорите, верно, но вы не ответили на вопрос. - person Solomon Slow; 30.09.2015
comment
@jameslarge: Применяет ли объект Java Lock отношение «происходит до»? Да, это так. Как и в случае с неявными блокировками, только один поток может одновременно владеть объектом Lock. Разве это не ответ? - person Andres; 30.09.2015
comment
Да, но в ответе вы говорите только о взаимоисключающих и условных переменных. Это не говорит, что происходит раньше где угодно. Идея гарантии «случается до того, как» — это совершенно отдельная тема от того, сколько потоков может владеть мьютексом в данный момент времени. - person Solomon Slow; 30.09.2015
comment
@jameslarge: Извините, вы этого не понимаете, но идея гарантии «до того, как произойдет», напрямую связана с тем фактом, что только один поток может владеть объектом блокировки одновременно. - person Andres; 30.09.2015
comment
Как же так? Мьютексы были в Java с самого начала, но первое упоминание об отношениях, подобных предшествующим, в мьютексах Java было jcp.org/en/jsr/detail?id=133 — впервые реализовано на платформе Java 5. Я не знаю ни одной теории, которая говорит, что вы не можете реализовать мьютекс, не обеспечив также согласованность памяти между потоками. (Мне знаю книги, объясняющие, почему вам не следует этого делать. amazon.com/Art-Multiprocessor-Programming-Revised-Reprint/dp/ ) - person Solomon Slow; 30.09.2015
comment
@jameslarge: Проверил вашу ссылку, и она не включает фразу «происходит раньше» (как и мой не-ответ!). Кстати, интерфейс блокировки был включен в Java 5, как вы, вероятно, читали во многих книгах. - person Andres; 30.09.2015