O estado seguro é livre de conflito, com certeza, mas se você não puder atender a todos os requisitos para impedir o conflito, isso poderá ocorrer. Por exemplo, se dois encadeamentos entrarem em conflito quando iniciarem o encadeamento A, depois o encadernar B, mas quando iniciarem o oposto (B, A) funcionarão bem - deixe-me supor que B seja melhor;) O estado do sistema não é seguro, mas com a sequência inicial afortunada, estará funcionando. Sem impasse, mas é possível. Se você também sincronizá-los manualmente - inicie em boa ordem - é perigoso - por algum motivo, eles podem não ser acionados como você gosta - o sistema ainda não é seguro (por causa de um possível impasse), mas há uma baixa probabilidade disso. No caso de alguns eventos externos, como congelar threads ou interromper depois de continuar, ele falhará.
Você deve perceber - o estado seguro é condição suficiente para evitar um conflito, mas inseguro é apenas uma condição necessária. É difícil escrever código fora de controle agora, mas posso procurar por alguns. Eu encontrei um código no Ada que, mais de 99/100 vezes, funcionava perfeitamente por várias semanas (e depois parava devido à reinicialização do servidor e não a um impasse), mas de vez em quando estava travando após vários segundos no estado de impasse.
Deixe-me adicionar um exemplo fácil comparando com a divisão: se sua função divide c / de retorna resultado, sem verificar se d é igual a 0, pode haver erro de divisão por zero, portanto, o código é inseguro (mesma nomeação pretendida), mas até você faz essa divisão, está tudo bem, mas depois que o código de análise teórica é inseguro e pode cair em comportamento indefinido, não é tratado adequadamente.