[color=orange]在两个或多个任务中,如果每个任务锁定了其他任务试图锁定的资源,此时会造成这些任务永久阻塞,从而出现死锁。例如:事务A 获取了行 1 的共享锁。事务 B 获取了行 2 的共享锁。
现在,事务 A 请求行 2 的排他锁,但在事务 B 完成并释放其对行 2 持有的共享锁之前被阻塞。
现在,事务 B 请求行 1 的排他锁,但在事务 A 完成并释放其对行 1 持有的共享锁之前被阻塞。
事务 B 完成之后事务 A 才能完成,但是事务 B 由事务 A 阻塞。该条件也称为循环依赖关系:事务 A 依赖于事务 B,事务 B 通过对事务 A 的依赖关系关闭循环。[/color]
java模拟死锁:
public class TestDealLock implements Runnable { public int i = 1; public static Object o1 = new Object(); public static Object o2 = new Object(); public void run() { if(i == 1) { synchronized (o1) { try { Thread.sleep(500); } catch (InterruptedException e) { } synchronized (o2) { System.out.println("1"); } } } if(i == 0) { synchronized (o2) { try { Thread.sleep(500); } catch (Exception e) { } synchronized (o1) { System.out.println("0"); } } } } }
测试死锁:
public class Test { /** * @param args */ public static void main(String[] args) { TestDealLock test1 = new TestDealLock(); TestDealLock test0 = new TestDealLock(); test1.i = 1; test0.i = 0; Thread t1 = new Thread(test1); Thread t0 = new Thread(test0); t1.start(); t0.start(); } }