Потоки блокировки чтения и записи, ожидающие блокировки чтения

У меня есть многопоточная программа, в которой я создал экземпляр ReadWriteLock с истинной справедливой стоимостью. Это приложение перестало отвечать.

Ниже приведены наши выводы на основе дампа потока. Один поток получил блокировку чтения и заблокировал операцию БД во время выполнения. Долго не отпускал замок.

Есть еще три потока, кроме вышеупомянутого. Один поток ожидает блокировки записи. В то время как два других потока ожидают блокировки чтения.

Вопрос в том, почему два потока ждут блокировки чтения? Это происходит потому, что справедливая стоимость истинна, и поток, запрашивающий блокировку записи, пришел раньше, чем два потока, запросившие блокировку чтения? Будет ли система блокировать потоки, запрашивающие блокировку чтения, если поток, запрашивающий запись, пришел раньше?


person Anuj    schedule 20.03.2015    source источник
comment
Можете выложить тред-дамп? Потоки будут блокироваться только на readLock, если writeLock удерживается.   -  person John Vint    schedule 20.03.2015


Ответы (1)


Когда вы устанавливаете для значения справедливости Java ReentrantReadWriteLock значение true, попытка получить блокировку чтения будет заблокирована, если в настоящее время существует поток, ожидающий получения блокировки записи, как вы предполагаете. Из Javadoc:

«Поток, который пытается получить справедливую блокировку чтения (без повторного входа), будет блокироваться, если либо удерживается блокировка записи, либо существует ожидающий записывающий поток».

В вашей ситуации, как только текущее чтение завершится, потоку, ожидающему записи, будет разрешено запись, тогда другим потокам, ожидающим чтения, будет разрешено чтение.

person Warren Dew    schedule 20.03.2015