<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Java 中的活鎖和死鎖 > 原文: [https://javatutorial.net/livelock-and-deadlock-in-java](https://javatutorial.net/livelock-and-deadlock-in-java) 以下文章討論了 Java 中的活鎖和死鎖狀態,它們如何發生以及如何避免它們。 ## 活鎖 Java 中的活鎖是一種遞歸條件,其中兩個或多個線程不斷重復一段特定的代碼。 當一個線程不斷響應另一個線程并且另一個線程也執行相同操作時,就會發生活鎖。 要對其進行分解,我們可以總結以下幾點: * 一個線程響應另一個線程的行為而運行,而另一個線程也響應先前的線程而運行,則可能發生活鎖。 * 活鎖線程無法繼續進行。 * 線程沒有被阻塞; 他們只是忙于互相回應。 活鎖也被稱為資源匱乏的特例 讓我們通過將其與現實世界聯系起來來理解該概念。 考慮兩輛車在狹窄橋梁的相對兩側。 一次只能乘一輛車通過橋。 這兩輛車的駕駛員都很有禮貌,正在等待對方先通過橋。 他們互相鳴叫,讓他們知道他們想讓對方先通過。 但是,兩者都沒有越過橋梁并互相鳴喇叭。 這種情況類似于活鎖。 現在,通過一些編碼來嘗試這種實際情況: 第一輛等待過橋的汽車的等級: ```java public class Car1 { private boolean honking = true; public void passBridge(Car2 car2) { while (car2.hasPassedBridge()) { System.out.println("Car1 waiting to pass the bridge"); try { Thread.sleep(1000); } catch (InterruptedException ex) { ex.printStackTrace(); } } System.out.println("Passed bridge"); this.honking= false; } public boolean hasPassedBridge() { return this.honking; } } ``` 等待通過橋的第二輛車的類別: ```java public class Car2 { private boolean honking = true; public void passBridge(Car1 car1) { while (car1.hasPassedBridge()) { System.out.println("Car 2 is waiting to pass the bridge!"); try { Thread.sleep(1000); } catch (InterruptedException ex) { ex.printStackTrace(); } } System.out.println("Car 2 has passed the bridge!"); this.honking = false; } public boolean hasPassedBridge() { return this.honking; } } ``` 主要測試類別: ```java public class BridgeCheck { static final Car2 car2 = new Car2(); static final Car1 car1 = new Car1(); public static void main(String[] args) { Thread t1 = new Thread(new Runnable() { public void run() { car2.passBridge(car1); } }); t1.start(); Thread t2 = new Thread(new Runnable() { public void run() { car1.passBridge(car2); } }); t2.start(); } } ``` 輸出: 這導致了非終止循環。 ## 死鎖 死鎖與活鎖有些不同。 死鎖是一種狀態,其中每個成員都在等待其他成員釋放鎖。 可能存在以下情況:一個線程正在等待另一個線程獲取的對象鎖,而第二個線程正在等待第一個線程獲取的對象鎖。 由于兩個線程都在互相等待釋放鎖,因此這種情況稱為死鎖。 ![](https://img.kancloud.cn/04/de/04de776b226096795e362b356106047a_782x192.jpg) 圖:死鎖狀態 讓我們看一下發生死鎖的情況: ```java public class DeadlockExample{ private static String A = "Something A"; private static String B = "Something B"; public void someFunction(){ synchronized(A){//may deadlock here synchronized(B){ // function does some work here } } } public void someOtherFunction(){ synchronized(B){//may deadlock here synchronized(A){ // the function does something here } } } } ``` 考慮兩個線程 T1 和 T2,T1 獲取 A 并等待 B 完成其功能。 但是,T2 獲取 B 并等待 A 完成其自身的功能。 在這里,T1 和 T2 正在等待被其他線程鎖定的資源。 因此,這是一個僵局方案。 ## 避免死鎖: * 第一個建議是避免同時使用多線程,但這在許多情況下可能不切實際。 因此,這種解決方案不是很明智。 * 分析并確保在事先訪問資源時沒有鎖。 * 在上面的編碼示例中,為避免死鎖,只需管理訪問資源的順序(訪問 A 和 B 的順序)。 * 避免一次持有多個鎖,以防萬一您必須始終以相同的順序獲得這些鎖。 * 避免在持有鎖的同時執行外來代碼。 * 嘗試使用可中斷的鎖,以便即使遇到死鎖,也可以中斷這些鎖,并且可以毫無問題地執行該過程。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看