Java 代碼模擬死鎖

題目描述

Java代碼模擬死鎖

死鎖條件

  • 互斥使用:一個(gè)資源只能分配給一個(gè)線程
  • 不可剝奪:資源只能由占有者釋放,申請(qǐng)者不能強(qiáng)制剝奪
  • 請(qǐng)求保持:線程申請(qǐng)資源時(shí),保持對(duì)原有資源的占有
  • 循環(huán)等待:存在一個(gè)進(jìn)程等待隊(duì)列:{P1 , P2 , … , Pn}, 其中P1等待P2占有的資源,P2等待P3占有的資源,…,Pn等待P1占有的資源,形成一個(gè)進(jìn)程等待環(huán)路
    代碼

思路

  • 定義兩個(gè)資源o1,o2
  • 對(duì)象deadLock1占有資源o1,需要資源o2
  • 對(duì)象deadLock2占有資源o2,需要資源o1
  • 死鎖產(chǎn)生

代碼

public class DeadLock implements Runnable {

    // flag=1,占有對(duì)象o1,等待對(duì)象o2
    // flag=0,占有對(duì)象o2,等待對(duì)象o1
    public int flag = 1;

    // 定義兩個(gè)Object對(duì)象,模擬兩個(gè)線程占有的資源
    public static Object o1 = new Object();
    public static Object o2 = new Object();

    public static void main(String[] args) {

        DeadLock deadLock1 = new DeadLock();
        DeadLock deadLock2 = new DeadLock();

        deadLock1.flag = 0;
        deadLock2.flag = 1;

        Thread thread1 = new Thread(deadLock1);
        Thread thread2 = new Thread(deadLock2);

        thread1.start();
        thread2.start();

    }

    public void run() {

        System.out.println("flag: " + flag);

        // deadLock2占用資源o1,準(zhǔn)備獲取資源o2
        if (flag == 1) {
            synchronized (o1) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o2) {
                    System.out.println("1");
                }
            }
        }

        // deadLock1占用資源o2,準(zhǔn)備獲取資源o1
        else if (flag == 0) {
            synchronized (o2) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o1) {
                    System.out.println("0");
                }
            }
        }
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 題目描述 Java代碼模擬死鎖 死鎖條件 互斥使用:一個(gè)資源只能分配給一個(gè)線程 不可剝奪:資源只能由占有者釋放,申...
    被稱為L(zhǎng)的男人閱讀 2,964評(píng)論 2 2
  • 1、競(jìng)態(tài)條件: 定義:競(jìng)態(tài)條件指的是一種特殊的情況,在這種情況下各個(gè)執(zhí)行單元以一種沒有邏輯的順序執(zhí)行動(dòng)作,從而導(dǎo)致...
    Hughman閱讀 1,331評(píng)論 0 7
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,766評(píng)論 18 399
  • 不久前還在和朋友感慨,下了一個(gè)多星期的雨,不知不覺已是深夏,現(xiàn)在按節(jié)氣來看,立秋已過,處暑也已經(jīng)不遠(yuǎn)了 。 無(wú)意之...
    簡(jiǎn)白007閱讀 310評(píng)論 0 1
  • 九月,風(fēng)和日麗,藍(lán)天白云,看著藍(lán)天白云,好想出去走走,總是覺得沒時(shí)間,很想很快老去,不被瑣事而牽絆,隨...
    Dave云閱讀 492評(píng)論 0 0