避免死锁的策略 - 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;
   }
  }
 }
}

“那是一个漂亮的解决方案。”

“这是一个非常简单的解决方案,但我喜欢它。我希望它对你在思考如何解决潜在的死锁问题时有用。”

“谢谢,艾莉。”