Java線程:併發協作-死鎖

Java線程:併發協作-死鎖
 
線程發生死鎖可能性很小,即使看似可能發生死鎖的代碼,在運行時發生死鎖的可能性也是小之又小。
 
發生死鎖的原因一般是兩個對象的鎖相互等待造成的。
 
在《Java線程:線程的同步與鎖》一文中,簡述死鎖的概念與簡單例子,但是所給的例子是不完整的,這裏給出一個完整的例子。
 
/**
* Java線程:併發協作-死鎖
*
* @author Administrator 2009-11-4 22:06:13
*/

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;
                        }
                }
        }
}
 
下面死鎖的情況發生了,真是難得一見啊:
 
<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
閱讀(132) | 評論(0) | 轉發(0) |
給主人留下些什麼吧!~~
評論熱議
發佈了47 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章