Безопасное состояние наверняка не блокируется, но если вы не можете выполнить все требования для предотвращения тупика, это может произойти. Например, если два потока могут зайти в тупик, когда они запускают поток A, то поток B, но когда они начинают противоположное (B, A), они будут работать нормально - позвольте мне предположить, что B приятнее;) Состояние системы небезопасно, но с удачной стартовой последовательностью это будет работать. Нет тупика, но это возможно. Если вы также синхронизируете их вручную - начинайте в хорошем порядке - это опасно - по какой-то причине они могут не срабатывать, как вам нравится - система все еще небезопасна (из-за возможного тупика), но вероятность этого мала. В случае некоторых внешних событий, таких как замораживание потоков или прерываний после продолжения, произойдет сбой.
Вы должны понимать - безопасное состояние является достаточным условием, чтобы избежать тупика, но небезопасное является лишь необходимым условием. Трудно написать код без головы прямо сейчас, но я могу искать некоторые. Я сталкивался с кодом в Ada, что более 99/100 раз он прекрасно работал в течение нескольких недель (а затем останавливался из-за перезапуска сервера, а не тупика), но время от времени он падал через несколько секунд в состояние тупика.
Позвольте мне добавить несколько простых примеров, сравнивая с делением: если ваша функция делит c / d и возвращает результат, не проверяя, равен ли d 0, может быть ошибка деления на ноль, поэтому код небезопасен (то же самое предназначение именования), но до Вы делаете такое деление, все в порядке, но после теоретического анализа код небезопасен и может привести к неопределенному поведению, не обработанному должным образом.