当前位置:嗨网首页>书籍在线阅读

08-案例实现

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

案例实现

根据如下步骤实现本案例。

1.创建 BadLocks 类,它包含两个方法,分别命名为 operation1()operation2()

public class BadLocks {
  private Lock lock1, lock2;
  public BadLocks(Lock lock1, Lock lock2) {
    this.lock1=lock1;
    this.lock2=lock2;
  }
  public void operation1(){
    lock1.lock();
    lock2.lock();
    try {
      TimeUnit.SECONDS.sleep(2);
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
      lock2.unlock();
      lock1.unlock();
    }
  }
  public void operation2(){
    lock2.lock();
    lock1.lock();
    try {
      TimeUnit.SECONDS.sleep(2);
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
      lock1.unlock();
      lock2.unlock();
    }
  }
}

2.分析上面这段代码,如果一个线程调用了 operation1() 方法,而另一个线程调用 operation2() 方法,此时就将产生死锁。 operation1()operation2() 同时执行了各自的第一条语句, operation1() 方法处于等待 lock2 的状态,而 operation2() 处于等待 lock1 的状态,所以产生了死锁。

3.解决死锁可以遵循如下规则。

  • 如果需要在不同的操作中获取多个锁,那么请尝试在所有操作中以相同的顺序来获取锁。
  • 然后,以相反的顺序来释放锁。建议将加锁和解锁封装在一个类中,这样就不会把与同步相关的代码分散各处了。