Блокировка Java и отношение happend-before - PullRequest
1 голос
/ 29 октября 2011

Я не уверен, правильно ли я интерпретирую Javadoc. При использовании ReentrantLock после вызова метода lock и успешного получения блокировки вы можете просто получить доступ к любому объекту без каких-либо синхронизированных блоков и магическим образом обеспечивается связь happend-before?

Я не вижу никакой связи между ReentrantLock и объектами, над которыми я работаю, поэтому трудно поверить, что я могу над ними безопасно работать. Но это тот случай, или я неправильно читаю Javadoc?

Ответы [ 3 ]

4 голосов
/ 29 октября 2011

Если поток A изменил какой-либо объект внутри блока кода CB1, защищенного блокировкой, а затем снял блокировку, и поток B входит в блок кода, защищенный той же блокировкой, тогда поток B увидит изменения, выполненные потоком Aв блоке кода CB1.

Если два потока читают и записывают одно и то же общее состояние, то каждое чтение и запись в это состояние должно быть защищено одной и той же блокировкой.

2 голосов
/ 29 октября 2011

В этом нет магии. Вы в безопасности, если и только если все потоки, обращающиеся к объекту, используют одну и ту же блокировку - будь то ReentrantLock или любой другой мьютекс, например, блок synchronized.

Существование ReentrantLock оправдано тем, что оно обеспечивает большую гибкость, чем synchronized: например, вы можете просто попытаться получить блокировку - невозможно с synchronized.

2 голосов
/ 29 октября 2011

Это ... блокировка (мьютекс):

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 можно найти здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...