Что происходит с блокировкой чтения, если текущий поток падает
Как говорит заголовок, любопытно, что происходит с блокировкой чтения, когда текущий поток падает.
readlock.lock();
try {
...
} finally {
readlock.unlock();
}
Мы можем определенно разблокировать в блоке finally, чтобы предотвратить любое прерывание. Но что, если оператор readLock.lock() аварийно завершает работу, блокировка автоматически снимается?
Спасибо,
3 ответа
- Если
readlock.lock
выбрасывает исключение. - Операция блокировки не удалась.
- Нет блокировки приобретается.
- нет
unlock
необходимо.
Если во время выполнения возникает исключение readlock.lock
Тем не менее, замок приобретается. lock
Автор реализует это неправильно. Вы можете отправить сообщение об ошибке для автора:)
Если вы ссылаетесь на java.util.concurrent.locks.ReentrantReadWriteLock
класс затем сбой потока сразу после readlock.lock()
(readlock.unlock()
не был вызван) не снимет блокировку чтения.
Это отличается от блокировки записи, хотя. Блокировка записи определяет владельца и может быть снята только тем потоком, который его приобрел. Напротив, блокировка чтения не имеет понятия владения, и нет требования, чтобы поток, освобождающий блокировку чтения, был таким же, как тот, который его получил.
Я бы предложил поставить readlock.lock()
в пробное заявление.
Это зависит от вашей реализации переменной "readlock" и "как произошел сбой потока". Насколько я вижу, переменная "readlock" может быть любого типа, и существует несколько причин сбоя потока.
Только для вашего сведения, у каждого объекта Java есть "монитор". Если вам нужно синхронизировать доступ к общей переменной несколькими потоками, я советую вам потратить некоторое время на изучение этой главы учебника по Java: http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html