1、由于不同线程对两个锁获取的顺序不一致造成的死锁,叫做锁顺序死锁。
2、代码示例如下:
/** * LeftRightDeadlock * * Simple lock-ordering deadlock * * @author Brian Goetz and Tim Peierls */ 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(); } } } void doSomething() { } void doSomethingElse() { } }
leftRight和rightLeft这两个方法分别获得left锁和right锁。如果一个线程调用了leftRight,而另一个线程调用了rightLeft,并且这两个线程的操作时交错执行,那么它们会发生死锁。
这个示例发生死锁的原因:两个线程试图以不同的顺序来获得相同的锁。如果按照相同的顺序来请求锁,那么就不会出现循环的加锁依赖性,因此也就不会产生死锁。