在实际编程中,死锁虽然不常见,可是若是遇到死锁即是致命的。接下来了解一下《操做系统》对于死锁产生条件的描述。java
死锁产生的条件:编程
(1)互斥条件:所谓互斥就是进程在某一时间内独占资源。ide
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已得到的资源保持不放。this
(3)不剥夺条件:进程已得到资源,在末使用完以前,不能强行剥夺。操作系统
(4)循环等待条件:若干进程之间造成一种头尾相接的循环等待资源关系。.net
根据上述四个条件咱们来编写一个线程死锁的例子:线程
public class Test { public static void main(String[] args) { DeadlockRisk dead = new DeadlockRisk(); MyThread t1 = new MyThread(dead, 1, 2); MyThread t2 = new MyThread(dead, 3, 4); MyThread t3 = new MyThread(dead, 5, 6); MyThread t4 = new MyThread(dead, 7, 8); t1.start(); t2.start(); t3.start(); t4.start(); } } class MyThread extends Thread { private DeadlockRisk dead; private int a, b; MyThread(DeadlockRisk dead, int a, int b) { this.dead = dead; this.a = a; this.b = b; } @Override public void run() { dead.read(); dead.write(a, b); } } class DeadlockRisk { private static class Resource { public int value; } private Resource resourceA = new Resource(); private Resource resourceB = new Resource(); public int read() { synchronized (resourceA) { System.out.println("read():" + Thread.currentThread().getName() + "获取了resourceA的锁!"); synchronized (resourceB) { System.out.println("read():" + Thread.currentThread().getName() + "获取了resourceB的锁!"); return resourceB.value + resourceA.value; } } } public void write(int a, int b) { synchronized (resourceB) { System.out.println("write():" + Thread.currentThread().getName() + "获取了resourceA的锁!"); synchronized (resourceA) { System.out.println("write():" + Thread.currentThread().getName() + "获取了resourceB的锁!"); resourceA.value = a; resourceB.value = b; } } } } //运行结果 read():Thread-0获取了resourceA的锁! read():Thread-0获取了resourceB的锁! write():Thread-0获取了resourceA的锁! read():Thread-3获取了resourceA的锁!
上面的执行结果基本能够看出死锁,咱们能够看一下线程dumpcode
Java stack information for the threads listed above: =================================================== "Thread-3": at com.thread.base.dead.DeadlockRisk.read(DeadlockRisk.java:16) - waiting to lock <0x00000007957972e8> (a com.thread.base.dead.DeadlockRisk$Resource) at com.thread.base.dead.MyThread.run(MyThread.java:18) "Thread-2": at com.thread.base.dead.DeadlockRisk.read(DeadlockRisk.java:18) - waiting to lock <0x00000007957972f8> (a com.thread.base.dead.DeadlockRisk$Resource) - locked <0x00000007957972e8> (a com.thread.base.dead.DeadlockRisk$Resource) at com.thread.base.dead.MyThread.run(MyThread.java:18) "Thread-0": at com.thread.base.dead.DeadlockRisk.write(DeadlockRisk.java:28) - waiting to lock <0x00000007957972e8> (a com.thread.base.dead.DeadlockRisk$Resource) - locked <0x00000007957972f8> (a com.thread.base.dead.DeadlockRisk$Resource) at com.thread.base.dead.MyThread.run(MyThread.java:19) Found 1 deadlock.//发现死锁
更多关于线程dump能够参考:http://my.oschina.net/u/161458/blog/266313orm