<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 中的對象級別鎖與類級別鎖 > 原文: [https://howtodoinjava.com/java/multi-threading/object-vs-class-level-locking/](https://howtodoinjava.com/java/multi-threading/object-vs-class-level-locking/) 在 Java 中,**同步的**代碼塊一次只能由一個線程執行。 另外,java 支持同時執行多個線程。 這可能會導致兩個或多個線程同時訪問相同的字段或對象。 同步是使所有并發線程在執行中保持同步的過程。 同步避免了由于共享內存視圖不一致而導致的內存一致性錯誤。 當方法聲明為**同步**時,該線程持有該方法對象的監視器或[**鎖定**](https://howtodoinjava.com/java/multi-threading/how-to-use-locks-in-java-java-util-concurrent-locks-lock-tutorial-and-example/)對象。 如果另一個線程正在執行*同步的*方法,則該線程將被阻塞,直到該線程釋放監視器。 請注意,我們可以在類中的已定義方法或塊上使用`synchronized`關鍵字。 `synchronized`關鍵字不能與類定義中的變量或屬性一起使用。 ## 1\. Java 中的對象級別鎖定 **對象級別鎖定**是一種機制,當我們要同步**非靜態方法**或**非靜態代碼塊**時,僅一個線程將能夠執行給定類實例上的代碼塊。 應始終執行它,來使實例級數據線程安全。 對象級別鎖定可以通過以下方式完成: ```java public class DemoClass { public synchronized void demoMethod(){} } or public class DemoClass { public void demoMethod(){ synchronized (this) { //other thread safe code } } } or public class DemoClass { private final Object lock = new Object(); public void demoMethod(){ synchronized (lock) { //other thread safe code } } } ``` ## 2\. Java 中的類級別鎖定 **類級別鎖**防止在運行時該類的所有可用實例中的多個線程進入`synchronized`塊。 這意味著,如果在運行時有`DemoClass`的 100 個實例,則一次只能在一個實例中的任何一個線程上執行`demoMethod()`,而所有其他實例將被其他線程鎖定。 應該始終執行類級別鎖定**以使靜態數據線程安全**。 我們知道 [**靜態**](https://howtodoinjava.com/java/basics/java-static-keyword/) 關鍵字將方法的數據關聯到類級別,因此請使用對靜態字段或方法的鎖定使其在類級別上。 ```java public class DemoClass { //Method is static public synchronized static void demoMethod(){ } } or public class DemoClass { public void demoMethod() { //Acquire lock on .class reference synchronized (DemoClass.class) { //other thread safe code } } } or public class DemoClass { private final static Object lock = new Object(); public void demoMethod() { //Lock object is static synchronized (lock) { //other thread safe code } } } ``` ## 3\. 對象級別鎖與類級別鎖 – 重要說明 1. Java 中的同步保證了沒有兩個線程可以同時或并發執行需要相同鎖的同步方法。 2. `synchronized`關鍵字只能與方法和代碼塊一起使用。 這些方法或塊都可以是*靜態*或*非靜態*。 3. 每當線程進入 Java `synchronized`方法或塊時,它都會獲取一個鎖,而當線程離開同步方法或塊時,它將釋放該鎖。 即使線程在完成后或由于任何錯誤或異常而離開同步方法時,也會釋放鎖定。 4. Java `synchronized`關鍵字本質上是**重入者**,這意味著如果同步方法調用了另一個需要相同鎖的同步方法,則持有鎖的當前線程可以進入該方法而無需獲取鎖。 5. 如果在同步塊中使用的對象為 null,則 Java 同步將拋出[`NullPointerException`](https://howtodoinjava.com/java/exception-handling/how-to-effectively-handle-nullpointerexception-in-java/)。 例如,在以上代碼示例中,如果將鎖初始化為 null,則“ `synchronized (lock)`”將拋出`NullPointerException`。 6. Java 中的同步方法使您的應用程序性能降低。 因此,在絕對需要時使用同步。 另外,請考慮使用同步的代碼塊僅同步代碼的關鍵部分。 7. 靜態同步方法和非靜態同步方法都可能同時或同時運行,因為它們鎖定在不同的對象上。 8. 根據 Java 語言規范,不能將`synchronized`關鍵字與構造器一起使用。 這是非法的,并導致編譯錯誤。 9. 不要在 Java 中的同步塊上的非 final 字段上進行同步。 因為對非 final 字段的引用可能隨時更改,然后不同的線程可能會在不同的對象上進行同步,即完全沒有同步。 10. 不要使用 String 字面值,因為它們可能在應用程序中的其他地方被引用,并且可能導致死鎖。 使用`new`關鍵字創建的字符串對象可以安全使用。 但是,作為最佳實踐,請在我們要保護的共享變量本身上創建一個新的**私有**范圍內的`Object`實例 OR 鎖。(感謝 Anu 在評論中指出這一點。) 讓我知道有關 Java 中對象級別鎖與類級別鎖的想法和查詢。 學習愉快!
                  <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>

                              哎呀哎呀视频在线观看