Можно избежать взаимных блокировок, если вы следуете простому правилу: все потоки требуют и снимают свои блокировки в том же порядке. Таким образом, вы никогда не попадете в ситуацию, когда может возникнуть тупик.
Даже проблема столовых философов может рассматриваться как нарушение этого правила, поскольку в нем используются относительные понятия левой и правой ложек, которые приводят к разным потокам с использованием разных порядков распределения ложек. Если бы ложки были пронумерованы однозначно, а философы все сначала попытались получить ложку с наименьшим номером, тупик был бы невозможен.
На мой взгляд, профилактика лучше лечения.
Это одно из двух правил, которым я хотел бы следовать, чтобы обеспечить правильную работу потоков. Другой гарантирует, что каждый поток исключительно отвечает за свое собственное выполнение, поскольку он единственный полностью осознает, что он делает в любой момент времени.
Так что это означает, что нет вызовов Thread.stop
, используйте глобальный флаг (или очередь сообщений или что-то в этом роде), чтобы сообщить другому потоку, что вы хотите выполнить действие. Затем пусть этот поток выполнит реальную работу.