почему поток, ожидающий блокировки объекта, не реагирует на прерывание? я провел поиск и прочитал прерывание заблокированного потока. Я понимаю аргументы, как в java, только методы могут быть принудительно генерированы исключениями, а синхронизированные блоки не могут быть принудительно генерированы исключениями и т. д. Но такое поведение ожидания блокировки кажется очевидной причиной взаимоблокировок, так почему не язык Спецификация заставляет синхронизированные блоки генерировать прерванное исключение и заставлять разработчика обрабатывать его? есть ли какая-то веская причина, по которой спецификация языка не должна этого делать? Также в ответе говорится, что прерывания - это не только остановка/отмена потоков. Если это так, то почему Lock.lockInterruptably() появился позже?
почему поток не ожидает блокировки объекта в ответ на прерывание?
Ответы (1)
Весь смысл ключевого слова synchronized
в том, чтобы быть простым (или, по крайней мере, настолько простым, насколько может быть многопоточность). Об этом прямо сказано в руководстве по Java по объектам Lock от Oracle:
Синхронизированный код основан на простой блокировке с повторным входом. Этот тип блокировки прост в использовании, но имеет много ограничений. Более сложные идиомы блокировки поддерживаются
java.util.concurrent.locks
пакет.
Одним из таких ограничений является отсутствие возможности прервать ожидающий поток.
По сути, принцип разработки заключается в том, что если вам просто нужна простейшая форма взаимного исключения, synchronized
подойдет; если вам нужно что-то большее, чем минимум, вам нужно использовать один из других, более сложных инструментов.
synchronized
дольше, чем требуется для обновления нескольких полей.
- person Solomon Slow; 24.02.2017
synchronized
начинает очень походить на объект Lock с try-finally.
- person yshavit; 25.02.2017
Object.wait
и т. д., а затем классов java.util.concurrent.*
в качестве промежуточного уровня сложности). Так что им пришлось где-то подвести черту под простым случаем — и они выбрали полный мьютекс, без возможности прерывания. Могли ли они выбрать что-то другое? Конечно. Это был приговор.
- person yshavit; 04.04.2017