#java #concurrency
перевод документации не сделал сабж понятнее для меня:
Потому что это по своей сути небезопасно. Это приводит к разблокировке всех залоченных
мониторов (исключение ThreadDeath пробрасывается вверх по стеку). Если любой из объектов,
ранее защищенный мониторами, был в неустойчивом состоянии, таким его теперь могут увидеть
другие потоки. Это может привести к неопределённому поведению, как скрытому труднообнаружимому,
так и ярковыраженному. В отличие от других unchecked-исключений, ThreadDeath убивает
потоки молча, так что пользователь может и не узнать, что его программа, вероятно,
повреждена. Повреждение может проявиться в любое время после реальной аварии, через
несколько часов или даже дней.
Можете привести пример, когда вызов этого метода действительно небезопасен?
Ответы
Ответ 1
Да все очень просто. Так как stop останавливает поток там, где его найдет, то и результат соотвествующий. К примеру, поток может залочить мютекс и начать выполнять свои действия. А тут его убивают. Мютекс остается залоченым. А раз есть мютекс, значит его использует ещё кто то (в нормально написанном коде). И этот кто то не сможет залочить мютекс. Пример ещё. Многие данные должны быть "консистенты". То есть, согласованными. Если поток прервать, то нет никакой гарантии, в каком именно состоянии будет система. Даже по коду угадать сложно. Все дело в том, что компилятор может переставлять некоторые инструкции для качественной оптимизации. А теперь представьте, что это кардиостимулятор или комплекс по управлению полетами самолетов...
Комментариев нет:
Отправить комментарий