Synchronized 和 Lock 的區別

Synchronized 是Java 併發程式設計中很重要的關鍵字,可用在方法、程式碼塊、物件上。

Lock 是 Java併發程式設計中很重要的一個介面,它要比 Synchronized 關鍵字更能直譯“鎖”的概念,Lock需要手動加鎖和手動解鎖,一般透過 lock。lock() 方法來進行加鎖, 透過 lock。unlock() 方法進行解鎖。與 Lock 關聯密切的鎖有 ReetrantLock 和 ReadWriteLock。

Synchronized 和 Lock 的區別

lock的方法

1。 lock:用來獲取鎖,如果鎖被其他執行緒獲取,處於等待狀態。如果採用Lock,必須主動去釋放 鎖,並且在發生異常時,不會自動釋放鎖。因此一般來說,使用Lock必須在try{}catch{}塊中進行,並且將釋放鎖的操作放在finally塊中進行,以保證鎖一定被被釋放,防止死鎖的發生。

2。 lockInterruptibly:透過這個方法去獲取鎖時,如果執行緒正在等待獲取鎖,則這個執行緒能夠響應中斷,即中斷執行緒的等待狀態。

3。 tryLock:tryLock方法是有返回值的,它表示用來嘗試獲取鎖,如果獲取成功,則返回true,如果獲取失敗(即鎖已被其他執行緒獲取),則返回false,也就說這個方法無論如何都會立即返回。在拿不到鎖時不會一直在那等待。

4。 tryLock(long,TimeUnit):與tryLock類似,只不過是有等待時間,在等待時間內獲取到鎖返回true,超時返回false。

5。 unlock:釋放鎖,一定要在finally塊中釋放

synchronized和lock的區別

Lock是一個介面,而synchronized是Java中的關鍵字,synchronized是內建的語言實現;

synchronized在發生異常時,會自動釋放執行緒佔有的鎖,因此不會導致死鎖現象發生;而Lock在發生異常時,如果沒有主動透過unLock()去釋放鎖,則很可能造成死鎖現象,因此使用Lock時需要在finally塊中釋放鎖;

Lock可以讓等待鎖的執行緒響應中斷,而synchronized卻不行,使用synchronized時,等待的執行緒會一直等待下去,不能夠響應中斷;

透過Lock可以知道有沒有成功獲取鎖,而synchronized卻無法辦到。

Lock可以提高多個執行緒進行讀操作的效率。(可以透過readwritelock實現讀寫分離)

效能上來說,在資源競爭不激烈的情形下,Lock效能稍微比synchronized差點(編譯程式通常會盡可能的進行最佳化synchronized)。但是當同步非常激烈的時候,synchronized的效能一下子能下降好幾十倍。而ReentrantLock確還能維持常態。