Java死鎖

死鎖的四個必要條件
1)互斥條件,即某個資源在一段時間內(nèi)只能由一個線程占有,不能同時被兩個或兩個以上的線程占有
2)不可搶占條件,線程所獲得的資源在未使用完畢之前,資源申請者不能強行地從資源占有者手中奪取資源,而只能由該資源的占有者線程自行釋放
3)占有且申請條件,線程至少已經(jīng)占有一個資源,但又申請新的資源;由于該資源已被另外線程占有,此時該線程阻塞;但是,它在等待新資源之時,仍繼續(xù)占用已占有的資源。
4)循環(huán)等待條件,存在一個線程等待序列{P1,P2,...,Pn},其中P1等待P2所占有的某一資源,P2等待P3所占有的某一源,......,而Pn等待P1所占有的的某一資源,形成一個線程循環(huán)等待環(huán)
解決死鎖的辦法:加鎖順序,死鎖檢測

下面通過代碼實例來講解一下如何去寫一個死鎖代碼&如何去解決死鎖問題

public class DeadLockTest {
    static class MyTask implements Runnable {
        Object obj1 = "obj1";
        Object obj2 = "obj2";
        int flag;
        private void setFlag(int flag) {
            this.flag = flag;
        }
        @Override
        public void run() {
            if (flag == 1) {
                synchronized (obj1) {
                    System.out.println("locking "+obj1);    //占用obj1
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (obj2) {
                        System.out.println("使用順序 obj1 -> obj2");
                    }
                }
            } else if (flag == 2) {
                synchronized (obj2) {
                    System.out.println("locking "+obj2);    //占用obj2
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (obj1) {
                        System.out.println("使用順序 obj2 -> obj1");
                    }
                }
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {

        MyTask myTask = new MyTask();

        myTask.setFlag(1);
        Thread thread1 = new Thread(myTask);
        thread1.start();

        //保證線程thread1優(yōu)先執(zhí)行
        Thread.sleep(100);

        myTask.setFlag(2);
        Thread thread2 = new Thread(myTask);
        thread2.start();
    }
}

通過兩個線程去競爭資源從而達到死鎖目的
解決方案

        MyTask myTask1 = new MyTask();
        myTask1.setFlag(2);
        Thread thread2 = new Thread(myTask1);
        thread2.start();

理論上是可以解決死鎖,但是并沒有成功,WTF!想了好久原來是字符串常量的問題,需要通過new String()方式解決,即

        Object obj1 = new String("obj1");
        Object obj2 = new String("obj2");
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 本篇結(jié)構(gòu): 前言 什么是死鎖 產(chǎn)生死鎖的必要條件 死鎖的代碼示例 死鎖排查 如何避免死鎖 總結(jié) 一、前言 今天被問...
    w1992wishes閱讀 367評論 0 0
  • 1、競態(tài)條件: 定義:競態(tài)條件指的是一種特殊的情況,在這種情況下各個執(zhí)行單元以一種沒有邏輯的順序執(zhí)行動作,從而導致...
    Hughman閱讀 1,434評論 0 7
  • 更多 Java 并發(fā)編程方面的文章,請參見文集《Java 并發(fā)編程》 死鎖 DeadLock 互斥:某個資源不能同...
    專職跑龍?zhí)?/span>閱讀 1,574評論 0 2
  • 死鎖的概念 死鎖的定義 在多道程序系統(tǒng)中,由于多個進程的并發(fā)執(zhí)行,改善了系統(tǒng)資源的利用率并提高了系統(tǒng)的處理能力。然...
    CodeKing2017閱讀 1,668評論 0 4
  • 前兩天“調(diào)侃”了一位年長朋友的文章。他算小城圈子里有點名氣的“鄉(xiāng)土文學創(chuàng)作者”。 我們以前互動比較多,近幾年聯(lián)系漸...
    晨風流嵐閱讀 652評論 1 7

友情鏈接更多精彩內(nèi)容