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確還能維持常態。


分享到:


相關文章: