亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有導致死鎖的情況,并建議我如何修復,我需要一般建議

有導致死鎖的情況,并建議我如何修復,我需要一般建議

千萬里不及你 2022-09-22 15:49:34
我學習爪哇多線程。有導致死鎖的情況,并建議我如何修復,我需要一般建議。我明白什么意味著什么死鎖概念,但它可以解決一個問題。這是代碼:應用類:// in multithreading. class Util {     // Util class to sleep a thread     static void sleep(long millis)     {         try        {             Thread.sleep(millis);         }         catch (InterruptedException e)         {             e.printStackTrace();         }     } } 共享類:// This class is shared by both threads class Shared {     // first synchronized method     synchronized void test1(Shared s2)     {         System.out.println("test1-begin");         Util.sleep(1000);         // taking object lock of s2 enters         // into test2 method         s2.test2(this);         System.out.println("test1-end");     }     // second synchronized method     synchronized void test2(Shared s1)     {         System.out.println("test2-begin");         Util.sleep(1000);         // taking object lock of s1 enters         // into test1 method         s1.test1(this);         System.out.println("test2-end");     } } java 線程 1 類:class Thread1 extends Thread {     private Shared s1;     private Shared s2;     // constructor to initialize fields     public Thread1(Shared s1, Shared s2)     {         this.s1 = s1;         this.s2 = s2;     }     // run method to start a thread     @Override    public void run()     {         // taking object lock of s1 enters         // into test1 method         s1.test1(s2);     } } java 線程 2 類:class Thread2 extends Thread {     private Shared s1;     private Shared s2;     // constructor to initialize fields     public Thread2(Shared s1, Shared s2)     {         this.s1 = s1;         this.s2 = s2;     }     // run method to start a thread     @Override    public void run()     {         // taking object lock of s2         // enters into test2 method         s2.test2(s1);     } }
查看完整描述

1 回答

?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

您提供的代碼確實會導致死鎖。最初, 獲取 的固有鎖,并獲取 的鎖。然后嘗試在仍然持有鎖的同時獲取鎖。由于鎖由 持有,將阻止等待鎖被釋放。類似的情況發生在:它嘗試在仍然持有鎖的同時獲取鎖。由于鎖由 持有,因此也會阻塞。這會導致僵局。t1s1t2s2t1s2s1s2t2t1t2s1s2s1t1t2


要解決此問題,兩個線程應僅使用一個鎖來同步其工作。一個可能的解決方案是:


class Shared

{

    private static final Object LOCK = new Object();


    // first synchronized method

    void test1(Shared s2)

    {

        synchronized (LOCK) {

            System.out.println("test1-begin");

            Util.sleep(1000);


            // taking object lock of s2 enters

            // into test2 method

            s2.test2(this);

            System.out.println("test1-end");

        }

    }


    // second synchronized method

    void test2(Shared s1)

    {

        synchronized (LOCK) {

            System.out.println("test2-begin");

            Util.sleep(1000);


            // taking object lock of s1 enters

            // into test1 method

            s1.test1(this);

            System.out.println("test2-end");

        }

    }

}

這將修復死鎖。但是,考慮到當前的實現,它將導致間接遞歸引起的無限循環:->->->->...s1.test1(s2)s2.test2(s1)s1.test1(s2)s2.test2(s1)


查看完整回答
反對 回復 2022-09-22
  • 1 回答
  • 0 關注
  • 103 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號