-
1 # 飛昇的碼農
-
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的鎖,那肯定是空指標異常
synchronized synchronized底層是對堆內的指定物件lock。那麼像上面obj引用如果是null,此時鎖的是什麼呢?
回覆列表
首先,瞭解一下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。