第10章 避免活跃性危险
在安全性与活跃性之间通常存在着某种制衡。我们使用加锁机制来确保钱程安全,但如果过度地使用如锁,则可能导致顺序死锁( Lock-Ordering Deadlock )。同意,我们使用线程和信号量来限制对资源的使用,但这些被限制的行为可能会导致资源死锁(Resource Deadlock )。
死锁
经典的“哲学家进餐”问题很好的描述了死锁状况。
当死锁出现时,往往是最糟糕的时候--高负载的情况下
锁顺序死锁
在LeftRightDeadLock中发生死锁的原因是:两个线程试图以不同的顺序来获得相同的锁。
public class LeftRightDeadLock {
private final Object left = new Object();
private final Object right = new Object();
public void leftRight() {
synchronized (left) {
synchronized (right) {
doSomething();
}
}
}
public void rightLeft() {
synchronized (right) {
synchronized (left) {
doSomethingElse();
}
}
}
}
如果所有线程以固定的顺序来获取锁,那么在程序中就不会出现顺序死锁的问题。