Что происходит с блокировкой чтения, если текущий поток падает

Как говорит заголовок, любопытно, что происходит с блокировкой чтения, когда текущий поток падает.

 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

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