Если вы следуете простому правилу, избегайте тупиковых ситуаций: попросите все потоки запросить и отпустите свои блокировки в том же порядке. Таким образом, вы никогда не попадаете в ситуацию, когда может возникнуть взаимоблокировка.
Даже проблема философов столовой может рассматриваться как нарушение этого правила, поскольку она использует относительные понятия левой и правой ложки, которые приводят к различным потокам с использованием разных ордеров распределения ложек. Если ложки были пронумерованы однозначно, и философы все сначала попытались получить самую низкую пронумерованную ложку, тупик был бы невозможным.
На мой взгляд, профилактика лучше, чем лечение.
Это одно из двух рекомендаций, которые мне нравятся, чтобы обеспечить правильную работу нитей. Другой - обеспечить каждую нить только, которая несет ответственность за собственное исполнение, так как она полностью знает, что она делает в любой момент времени.
Таким образом, это означает, что нет вызовов Thread.stop
, используйте глобальный флаг (или очередь сообщений или что-то в этом роде), чтобы указать другой поток, который вы хотите предпринять. Затем пусть этот поток выполняет фактическую работу.
Является ли Java отличным от других языков в этом отношении? – 2008-10-19 22:58:05
невозможно обнаружить тупик - это просто довольно сложно – 2008-10-19 23:00:49
например - большинство баз данных обнаружит взаимоблокировки – 2008-10-19 23:01:21