2009-11-12 7 views
1

Если поток, содержащий ReentrantReadWriteLock.writeLock(), перестает выполняться из-за неперехваченного исключения, является ли блокировка выпущена или она удерживается, и все остальные потоки теперь зашли в тупик?Что происходит, когда поток, удерживающий блокировку с ReentrantReadWriteLock, терпит неудачу?

ответ

3

Я предполагаю, что с помощью «fail» вы подразумеваете, что неперехваченное исключение распространяется с вершины метода Thread's run, заставляя его прекратить выполнение.

Если резьба используется finally, то она будет разблокирована writeLock на своем пути обратно в стек.

Если нить не вызывала unlock(), однако она по-прежнему удерживает этот монитор, даже если он больше не работает - так что да, другие потоки будут заторможены.

Вот почему очень важно правильно приобретать и выпускать ресурсы. А также причина придерживаться блоков synchronized, пока/до тех пор, пока вы не сможете установить, что вам нужны функции конкретных блокировок, - потому что они не могут не быть выпущены. (В вашем случае я уверен, что вам нужны отдельные блокировки чтения/записи, я делаю более общую точку здесь.)

0

Вы должны использовать блок try-finally при использовании «Явной блокировки», чтобы освободить любой замок, который вы приобрели.

Это ключевое различие между использованием синхронизации.