Trạng thái an toàn là bế tắc miễn phí, nhưng nếu bạn không thể thực hiện tất cả các yêu cầu để ngăn chặn bế tắc thì điều đó có thể xảy ra. Ví dụ: nếu hai luồng có thể rơi vào bế tắc khi chúng bắt đầu luồng A, sau đó là luồng B, nhưng khi chúng bắt đầu ngược lại (B, A) thì chúng sẽ hoạt động tốt - hãy giả sử B là đẹp hơn;) Trạng thái của hệ thống không an toàn, nhưng với chuỗi khởi đầu may mắn, nó sẽ hoạt động. Không bế tắc, nhưng nó có thể. Nếu bạn cũng đồng bộ hóa chúng bằng tay - bắt đầu theo thứ tự tốt - thật nguy hiểm - vì một số lý do chúng có thể không được kích hoạt như bạn muốn - hệ thống vẫn không an toàn (vì có thể bị bế tắc) nhưng khả năng đó là thấp. Trong trường hợp một số sự kiện bên ngoài như đóng băng chủ đề hoặc gián đoạn sau khi tiếp tục, nó sẽ thất bại.
Bạn phải nhận ra - trạng thái an toàn là điều kiện đủ để tránh bế tắc, nhưng không an toàn chỉ là điều kiện cần thiết. Ngay bây giờ thật khó để viết mã ra khỏi đầu, nhưng tôi có thể tìm kiếm một số. Tôi đã gặp mã trong Ada rằng hơn 99/100 lần nó hoạt động hoàn hảo trong vài tuần (và sau đó dừng lại do máy chủ khởi động lại không bế tắc) nhưng thỉnh thoảng nó bị sập sau vài giây ở trạng thái bế tắc.
Hãy để tôi thêm một số ví dụ dễ dàng bằng cách so sánh với phép chia: Nếu hàm của bạn chia c / d và trả về kết quả, mà không kiểm tra xem d có bằng 0 hay không, có thể có chia cho lỗi không, vì vậy mã không an toàn (cùng tên dự định), nhưng cho đến khi bạn thực hiện phân chia như vậy, mọi thứ đều ổn, nhưng sau khi mã phân tích lý thuyết không an toàn và có thể rơi vào hành vi không xác định không được xử lý đúng cách.