Các chiến lược để tránh deadLock - 1

"Chào, Amigo!"

"Tôi muốn nói với bạn về một vài chiến lược để tránh bế tắc."

"Chiến lược tốt nhất là một kiến ​​trúc chu đáo và một bộ quy tắc quản lý khi nào và theo thứ tự nào bạn có thể sử dụng khóa (có được các mutexes). Cách tiếp cận cổ điển cho vấn đề là phát triển một hệ thống phân cấp khóa và thiết lập quy tắc mà một số khóa nhất định không bao giờ có thể được có được trong trạng thái mà một số ổ khóa khác đã được mua."

"Ví dụ: đôi khi các khóa được chỉ định cấp độ và cần có một luồng để lấy khóa theo thứ tự từ cấp cao hơn xuống cấp thấp hơn (nhưng không được phép lấy khóa theo hướng khác). Ngoài ra, việc lấy nhiều khóa có cùng cấp độ không được phép cho phép."

"Ví dụ: trong ví dụ trước với các hiệp sĩ, chúng tôi có thể thêm một số (id) duy nhất cho mỗi hiệp sĩ và yêu cầu các ổ khóa được lấy từ id lớn hơn sang id nhỏ hơn."

Ví dụ
class KnightUtil
{
 public static void kill(Knight knight1, Knight knight2)
 {
  Knight knightMax = knight1.id > knight2.id ? knight1: knight2;
  Knight knightMin = knight1.id > knight2.id ? knight2: knight1;

  synchronized(knightMax)
  {
   synchronized(knightMin)
   {
    knight2.live = 0;
    knight1.experience +=100;
   }
  }
 }
}

"Đó là một giải pháp đẹp."

"Đó là một giải pháp rất đơn giản, nhưng tôi thích nó. Tôi hy vọng nó sẽ hữu ích cho bạn khi bạn đang suy nghĩ về cách giải quyết các vấn đề bế tắc tiềm ẩn."

"Cảm ơn, Ellie."