Блокировка Java и отношение happend-before
Я не уверен, правильно ли я интерпретирую Javadoc. При использовании ReentrantLock
после вызова lock
метод и успешно получая блокировку, можете ли вы просто получить доступ к любому объекту без каких-либо синхронизированных блоков, и отношение happend-before волшебным образом обеспечивается?
Я не вижу никакой связи между ReentrantLock
и объекты, над которыми я работаю, поэтому трудно поверить, что я могу работать над ними безопасно. Но это тот случай, или я неправильно читаю javadoc?
3 ответа
Если поток A изменил какой-либо объект внутри блока кода CB1, защищенного блокировкой, а затем снял блокировку, и поток B входит в блок кода, защищенный той же блокировкой, то поток B увидит изменения, выполненные потоком A в коде блок CB1.
Если два потока читают и записывают одно и то же общее состояние, то каждое чтение и запись в это состояние должно быть защищено одной и той же блокировкой.
В этом нет магии. Вы в безопасности, если и только если все потоки, обращающиеся к объекту, используют одну и ту же блокировку - будь то ReentrantLock
или любой другой мьютекс, такой как synchronized
блок.
Существование ReentrantLock
оправдано тем, что он обеспечивает большую гибкость, чем synchronized
: вы можете, например, просто попытаться получить блокировку - невозможно с synchronized
,
Это... (мьютекс) блокировка:
void myMethod()
{
myLock.lock(); // block until condition holds
try
{
// Do stuff that only one thread at a time should do
}
finally
{
myLock.unlock()
}
}
Только одна нить может удерживать блокировку одновременно, поэтому все, что находится между lock()
а также unlock()
вызовы гарантированно будут выполняться только одним потоком за раз.