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.解决死锁可以遵循如下规则。
- 如果需要在不同的操作中获取多个锁,那么请尝试在所有操作中以相同的顺序来获取锁。
- 然后,以相反的顺序来释放锁。建议将加锁和解锁封装在一个类中,这样就不会把与同步相关的代码分散各处了。