死鎖示例

死鎖示例

由于兩個鎖對象lock1,lock2是static只存在一份,導致兩個線程執(zhí)行時會相互等待已經被獲得的瑣對象,導致死鎖產生.
如果將static去掉,2個鎖對象就是線程獨有的變量,不會被別的線程發(fā)現(xiàn),因此不會產生死鎖.

public class DeadLock implements Runnable{
    private String tag;
    private static Object lock1 = new Object();
    private static Object lock2 = new Object();
    
    public void setTag(String tag){
        this.tag = tag;
    }
    
    @Override
    public void run() {
        if(tag.equals("a")){
            synchronized (lock1) {
                try {
                    System.out.println("當前線程 : "  + Thread.currentThread().getName() + " 進入lock1執(zhí)行");
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock2) {
                    System.out.println("當前線程 : "  + Thread.currentThread().getName() + " 進入lock2執(zhí)行");
                }
            }
        }
        if(tag.equals("b")){
            synchronized (lock2) {
                try {
                    System.out.println("當前線程 : "  + Thread.currentThread().getName() + " 進入lock2執(zhí)行");
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock1) {
                    System.out.println("當前線程 : "  + Thread.currentThread().getName() + " 進入lock1執(zhí)行");
                }
            }
        }
    }
    
    public static void main(String[] args) {
        
        DeadLock d1 = new DeadLock();
        d1.setTag("a");
        DeadLock d2 = new DeadLock();
        d2.setTag("b");
         
        Thread t1 = new Thread(d1, "t1");
        Thread t2 = new Thread(d2, "t2");
         
        t1.start();
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t2.start();
    }   
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 當線程需要兩個鎖oa ob來完成線程任務時,一個線程用oa鎖時,cpu切到另外一個線程,該線成用ob鎖,第一個線...
    李霖神谷閱讀 275評論 0 0
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,638評論 18 399
  • Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,894評論 0 11
  • 黃色的落葉落成刀 一下下削薄秋日的夢 樹下的影子躲閃不急 成對的腳印被細細的光撕裂 越扯越遠 有逝者的血液 涂滿了...
    野馬王閱讀 346評論 10 6
  • “夜幕落下, 我仔細上妝,涂抹口紅, 調整姿態(tài),靜靜等待, 寂寞到來”--幾米 The night falls ,...
    姜與小島閱讀 526評論 0 1

友情鏈接更多精彩內容