避免死鎖的策略 - 1

“嗨,阿米戈!”

“我想告訴你一些避免死鎖的策略。”

“最好的策略是一個深思熟慮的架構和一組規則來管理你何時以及以什麼順序可以使用鎖(獲取互斥量)。解決這個問題的經典方法是開發一個鎖層次結構並建立某些鎖永遠不能被使用的規則在已經獲得某些其他鎖的狀態下獲得。”

“比如,有時候鎖是分級別的,要求一個線程按照從高級別到低級別的順序去獲取鎖(但是反方向獲取鎖是不允許的)。另外,獲取多個同級別的鎖也是不可以的允許。”

“例如,在前面的騎士示例中,我們可以為每個騎士添加一個唯一編號 (id),並要求從較大的 id 到較小的 id 獲取鎖。”

例子
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;
   }
  }
 }
}

“那是一個漂亮的解決方案。”

“這是一個非常簡單的解決方案,但我喜歡它。我希望它對你在思考如何解決潛在的死鎖問題時有用。”

“謝謝,艾莉。”