<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Java `synchronized`關鍵字 > 原文: [https://howtodoinjava.com/java/multi-threading/java-synchronized/](https://howtodoinjava.com/java/multi-threading/java-synchronized/) **Java `synchronized`關鍵字**將塊或方法標記為臨界區。 臨界區是一次僅執行一個線程的線程,該線程持有同步部分的鎖。 `synchronized`關鍵字有助于編寫應用程序的[并發](https://howtodoinjava.com/java-concurrency-tutorial/)部分,以保護此塊中的共享資源。 `synchronized`關鍵字可以用于: * 一個代碼塊 * 一個方法 ## 1\. Java 同步塊 #### 1.1 語法 編寫同步塊的一般語法如下。 此處 `lockObject`是對對象的引用,該對象的鎖與同步語句表示的監視器關聯。 ```java synchronized( lockObject ) { // synchronized statements } ``` #### 1.2 內部工作 當線程要在同步塊內執行同步語句時,必須獲得`lockObject`監視器的鎖定。 一次,只有一個線程可以獲取鎖對象的監視器。 因此,所有其他線程必須等到當前已獲得鎖的該線程完成執行。 通過這種方式,`synchronized`關鍵字可確保一次僅一個線程將執行同步的塊語句,從而防止多個線程破壞該塊內部的共享數據。 請記住,如果一個線程進入睡眠狀態(使用`sleep()`方法),則它不會釋放鎖。 在此休眠時間,沒有線程將執行同步的塊語句。 如果`'synchronized (lock)'`中使用的鎖定對象為`null`,則 Java 同步將拋出`NullPointerException`。 #### 1.3 Java 同步塊示例 Java 程序演示同步塊的用法。 在給定的示例中,我們具有使用方法`printNumbers()`的`MathClass`。 此方法將打印從 1 到參數 N 的數字。 請注意,`printNumbers()`方法中的代碼在同步塊內部。 ```java public class MathClass { void printNumbers(int n) throws InterruptedException { synchronized (this) { for (int i = 1; i <= n; i++) { System.out.println(Thread.currentThread().getName() + " :: "+ i); Thread.sleep(500); } } } } ``` 我創建了兩個線程,它們開始完全同時執行`printNumbers()`方法。 由于塊被同步,因此僅允許一個線程訪問,而另一個線程必須等待直到第一個線程完成。 ```java public class Main { public static void main(String args[]) { final MathClass mathClass = new MathClass(); //first thread Runnable r = new Runnable() { public void run() { try { mathClass.printNumbers(3); } catch (InterruptedException e) { e.printStackTrace(); } } }; new Thread(r, "ONE").start(); new Thread(r, "TWO").start(); } } ``` 程序輸出。 ```java ONE :: 1 ONE :: 2 ONE :: 3 TWO :: 1 TWO :: 2 TWO :: 3 ``` ## 2\. Java 同步方法 #### 2.1 語法 編寫同步方法的一般語法如下。 此處`lockObject`是對對象的引用,該對象的鎖與同步語句表示的監視器關聯。 ```java <access modifier> synchronized method( parameters ) { // synchronized code } ``` #### 2.2 內部工作 與同步塊類似,線程必須使用同步方法來獲取關聯的監視對象上的鎖。 如果采用同步方法,則鎖定對象為: * `.class`對象 - 如果該方法是靜態的。 * `this`對象 - 如果方法不是靜態的。 `this`是指在其中調用同步方法的當前對象的引用。 > 閱讀更多: [Java 中的對象級別鎖與類級別鎖](https://howtodoinjava.com/java/multi-threading/object-vs-class-level-locking/) Java `synchronized`關鍵字本質上是**重入符**,這意味著如果同步方法調用了另一個需要相同鎖定的同步方法,則持有鎖定的當前線程可以進入該方法而無需獲取鎖定。 #### 2.3 Java 同步方法示例 與同步塊示例類似,我們可以在`printNumber()`方法上應用`synchronized`關鍵字,這將使該方法成為同步方法。 現在,如果再次運行示例,我們將獲得類似的輸出。 ```java public class MathClass { synchronized void printNumbers(int n) throws InterruptedException { for (int i = 1; i <= n; i++) { System.out.println(Thread.currentThread().getName() + " :: "+ i); Thread.sleep(500); } } } ``` 程序輸出: ```java ONE :: 1 ONE :: 2 ONE :: 3 TWO :: 1 TWO :: 2 TWO :: 3 ``` 在評論中把您的問題交給我。 學習愉快!
                  <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>

                              哎呀哎呀视频在线观看