Блокировка 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() вызовы гарантированно будут выполняться только одним потоком за раз.

Соответствующее руководство по Oracle можно найти здесь.

Другие вопросы по тегам