首頁>Club>
synchronized synchronized底層是對堆內的指定物件lock。那麼像上面obj引用如果是null,此時鎖的是什麼呢?
3
回覆列表
  • 1 # 飛昇的碼農

    首先,瞭解一下synchronized。

    synchronized

    它是java的同步鎖關鍵字,一般有四種用法:

    鎖程式碼塊

    鎖物件

    鎖方法

    鎖類

    鎖物件示例:

    synchronized (a) { a= a+ 1}

    鎖程式碼塊示例:

    synchronized(this) { a = a + 1; }

    鎖方法示例:

    private synchronized int add(int a){}

    鎖類示例:

    synchronized (AClazz) { a = a+1 }

    根據阿里巴巴Java開發手冊,同步鎖需要消耗很大的效能,所以在達到相同目的的情況下:

    無鎖優先於鎖

    鎖物件優先於鎖類

    鎖程式碼塊優先於鎖方法

    回到問題

    java synchronized鎖物件,當物件引用是null的時候,鎖的是什麼?它不會鎖任何物件,因為當使用synchronized鎖null時,它會丟擲NullPointerException。

  • 2 # Java實戰技術

    Java語言規範中明確指出如果鎖住的物件是null,則會NullPointerException,規範內容如下:

    The type of Expression must be a reference type, or a compile-time error occurs. A synchronized statement is executed by first evaluating the Expression. Then: If evaluation of the Expression completes abruptly for some reason, then the synchronized statement completes abruptly for the same reason. Otherwise, if the value of the Expression is null, a NullPointerException is thrown.

  • 3 # 三僡然

    在Java中,同步的程式碼塊一次只能由一個執行緒執行。此外,java支援多個執行緒同時執行。這可能導致兩個或多個執行緒同時訪問相同的欄位或物件。

    同步是使執行中的所有併發執行緒保持同步的過程。同步可避免由於共享記憶體檢視不一致而導致的記憶體一致性錯誤。當方法宣告為synchronized時 ; 該執行緒持有監視器或鎖定物件為這個方法的物件。如果另一個執行緒正在執行synchronized方法,則您的執行緒將被阻塞,直到該執行緒釋放監視器。

    請注意,我們可以在類中使用關鍵字來定義方法或塊。關鍵字不能與類定義中的變數或屬性一起使用。

    使用synchronized鎖 需要注意下面幾個方面

    Java中的同步保證沒有兩個執行緒可以同時或同時執行同步方法,這需要相同的鎖定。keyword只能用於方法和程式碼塊。這些方法或塊可以是靜態的還是非靜態兩種。當執行緒進入Java 方法或阻塞時,它獲取一個鎖,每當它離開同步方法或阻塞時,它就會釋放鎖。即使執行緒在完成後或由於任何錯誤或異常而離開同步方法,鎖也會被釋放。Java 關鍵字本質上是可重入的,這意味著如果同步方法呼叫另一個需要相同鎖定的同步方法,那麼持有鎖定的當前執行緒可以在不獲取鎖定的情況下進入該方法。如果synchronized塊中使用的物件為null,則丟擲Java同步。例如,在上面的程式碼示例中,如果將lock初始化為null,則將丟擲“ ” 。Java中的同步方法會為您的應用程式帶來效能成本。因此,在絕對需要時使用同步。另外,請考慮使用同步程式碼塊來僅同步程式碼的關鍵部分。靜態同步和非靜態同步方法可能同時或同時執行,因為它們鎖定在不同的物件上。根據Java語言規範,您不能將關鍵字與建構函式一起使用。這是非法的,會導致編譯錯誤。不要在Java中的同步塊上的非最終欄位上進行同步。因為非最終欄位的引用可能隨時改變,然後不同的執行緒可能在不同的物件上同步,即根本不同步。最好是使用String類,它已經是不可變的並且宣告為final。本人大廠程式設計師 喜歡的可以關注我

  • 4 # 帳外刀斧手

    這個問題的說法有點問題

    鎖不是一個動詞,是一個名詞

    我們一般說呼叫誰誰的鎖來控制對某部分資源的訪問,而不是鎖住了某部分資源(但有很多人喜歡這麼通俗地說)

    如果物件是null,你去呼叫null的鎖,那肯定是空指標異常

  • 中秋節和大豐收的關聯?
  • lol狗頭臺詞有哪些?