デッドロックを回避するための戦略 - 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;
   }
  }
 }
}

「それは素晴らしい解決策ですね。」

「これは非常に単純な解決策ですが、気に入っています。潜在的なデッドロックの問題を解決する方法を考えるときに役立つことを願っています。」

「ありがとう、エリー」