deadLock을 피하기 위한 전략 - 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;
   }
  }
 }
}

"그건 아름다운 해결책이군요."

"매우 간단한 솔루션이지만 마음에 듭니다. 잠재적인 교착 상태 문제를 해결하는 방법을 생각할 때 도움이 되었으면 합니다."

"고마워, 엘리."