线程同步——死锁

在实际编程中,死锁虽然不常见,可是若是遇到死锁即是致命的。接下来了解一下《操做系统》对于死锁产生条件的描述。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

相关文章
相关标签/搜索