Если вы читаете javadocs на ReadWriteLock и Lock, они специально говорят, что Locks должны предоставлять ту же семантику памяти, что и ключевое слово synchronized
:
Все реализации Lock должны применять ту же семантику синхронизации памяти, которая предусмотрена встроенной блокировкой монитора, как описано в Спецификации языка Java, третье издание (17.4 Модель памяти):
(Это от javadoc Lock; ReadWriteLock ссылается на Lock для описания его семантики.)
Итак, да, оно заменяет ключевое слово synchronized
. Фактически, вы могли бы заменить каждый synchronized
блок в вашем коде на Lock и иметь ту же семантику (и, в зависимости от jvm, возможно, даже небольшое повышение производительности). Но вы бы торговали немного быстрее для скорости больше подробностей, и если вы когда-нибудь забудете разблокировать одну из этих блокировок, вы можете заблокировать вашу программу.
Что во многом основано на этом, так это неблокирующие алгоритмы ( сравнение-и-замена , являющиеся их сердцем) в сочетании с семантикой памяти полей volatile
, которые указывают, что если вы пишете в volatile
поле, любой поток, который впоследствии читает это поле, должен видеть, по крайней мере, то же состояние мира, которое вы видели, когда писали его. (Они также могут увидеть некоторые или все из того, что произошло после этой записи.) Эти инструменты могут сделать довольно быстрый код, но они также тонкие и легко ошибаются - почти всегда лучше оставаться на более высоком уровне конструкции (например, используемый вами ReadWriteLock).