<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://howtodoinjava.com/java/multi-threading/writing-a-deadlock-and-resolving-in-java/](https://howtodoinjava.com/java/multi-threading/writing-a-deadlock-and-resolving-in-java/) 通過示例,以編程方式學習在 Java 中創建死鎖。 還學習**檢測死鎖**以及如何**解決源代碼**中的死鎖情況。 在我以前的文章中,我寫了關于[當屬性文件](//howtodoinjava.com/java-7/auto-reload-of-configuration-when-any-change-happen/ "Auto reload of configuration when any change happen")中發生任何更改時自動重載配置的信息,我討論了有關使用 Java `WatchService`刷新應用程序配置的信息。 由于配置是共享資源,并且通過[線程](https://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html "Java Thread class")進行訪問時,總是有機會編寫不正確的代碼,而這可能導致死鎖。 ## 1\. 死鎖 在 Java 中,[死鎖](https://en.wikipedia.org/wiki/Deadlock)是這樣的情況,其中至少有兩個線程在某個不同的資源上持有鎖,并且兩個線程都在等待其他資源完成其任務。 而且,沒有人能夠鎖定它所持有的資源。 ![deadlock scenario](https://img.kancloud.cn/2e/08/2e08e4928817931a638f569de1e9f4b2_249x164.png) 死鎖場景 在上述情況下,`Thread-1`具有`A`但需要`B`才能完成處理,類似地`Thread-2`具有資源`B`但首先需要`A`。 ```java package thread; public class ResolveDeadLockTest { public static void main(String[] args) { ResolveDeadLockTest test = new ResolveDeadLockTest(); final A a = test.new A(); final B b = test.new B(); // Thread-1 Runnable block1 = new Runnable() { public void run() { synchronized (a) { try { // Adding delay so that both threads can start trying to // lock resources Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } // Thread-1 have A but need B also synchronized (b) { System.out.println("In block 1"); } } } }; // Thread-2 Runnable block2 = new Runnable() { public void run() { synchronized (b) { // Thread-2 have B but need A also synchronized (a) { System.out.println("In block 2"); } } } }; new Thread(block1).start(); new Thread(block2).start(); } // Resource A private class A { private int i = 10; public int getI() { return i; } public void setI(int i) { this.i = i; } } // Resource B private class B { private int i = 20; public int getI() { return i; } public void setI(int i) { this.i = i; } } } ``` 由于非常明顯的原因,上面的代碼運行將導致死鎖(如上所述)。 現在我們必須解決這個問題。 ## 2\. 如何避免死鎖 我相信,解決任何問題的方法都在于確定問題的根源。 在我們的情況下,這是訪問資源`A`和`B`的模式,這是主要問題。 因此,要解決此問題,我們將僅對代碼訪問共享資源的語句重新排序。 ```java // Thread-1 Runnable block1 = new Runnable() { public void run() { synchronized (b) { try { // Adding delay so that both threads can start trying to // lock resources Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } // Thread-1 have A but need B also synchronized (a) { System.out.println("In block 1"); } } } }; // Thread-2 Runnable block2 = new Runnable() { public void run() { synchronized (b) { // Thread-2 have B but need A also synchronized (a) { System.out.println("In block 2"); } } } }; ``` 在類之前再次運行,您將不會遇到任何死鎖情況。 我希望,它將幫助您避免死鎖,如果遇到死鎖,也可以解決死鎖。 學習愉快!
                  <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>

                              哎呀哎呀视频在线观看