現在的位置: 首頁 > 雲計算 > 正文

Synchronzied 和 Lock 有什麼區別

2020年02月21日 雲計算 ⁄ 共 992字 ⁄ 字型大小 評論關閉

  很多東西都有所差異,你能總結出 synchronized 和 lock 鎖的實現 ReentrantLock 有什麼異同嗎?

  Synchronzied 和 Lock 的主要區別如下:

  存在層面:Syncronized 是Java 中的一個關鍵字,存在於 JVM 層面,Lock 是 Java 中的一個介面

  鎖的釋放條件:1. 獲取鎖的線程執行完同步代碼後,自動釋放;2. 線程發生異常時,JVM會讓線程釋放鎖;Lock 必須在 finally 關鍵字中釋放鎖,不然容易造成線程死鎖。

  鎖的獲取: 在 Syncronized 中,假設線程 A 獲得鎖,B 線程等待。如果 A 發生阻塞,那麼 B 會一直等待。在 Lock 中,會分情況而定,Lock 中有嘗試獲取鎖的方法,如果嘗試獲取到鎖,則不用一直等待。

  鎖的狀態:Synchronized 無法判斷鎖的狀態,Lock 則可以判斷。

  鎖的類型:Synchronized 是可重入,不可中斷,非公平鎖;Lock 鎖則是 可重入,可判斷,可公平鎖。

  鎖的性能:Synchronized 適用於少量同步的情況下,性能開銷比較大。Lock 鎖適用於大量同步階段:

  Lock 鎖可以提高多個線程進行讀的效率(使用 readWriteLock)

  在競爭不是很激烈的情況下,Synchronized的性能要優於ReetrantLock,但是在資源競爭很激烈的情況下,Synchronized的性能會下降幾十倍,但是ReetrantLock的性能能維持常態;

  ReetrantLock 提供了多樣化的同步,比如有時間限制的同步,可以被Interrupt的同步(synchronized的同步是不能Interrupt的)等。

  ReentrantLock 的加鎖流程是怎樣的,其實如果你能把源碼給他講出來的話,一定是高分。如果你記不住源碼流程的話可以記住下面這個簡化版的加鎖流程:

  如果 lock 加鎖設置成功,設置當前線程為獨佔鎖的線程;

  如果 lock 加鎖設置失敗,還會再嘗試獲取一次鎖數量。

  如果鎖數量為0,再基於 CAS 嘗試將 state(鎖數量)從0設置為1一次,如果設置成功,設置當前線程為獨佔鎖的線程。

  如果鎖數量不為0或者上邊的嘗試又失敗了,查看當前線程是不是已經是獨佔鎖的線程了,如果是,則將當前的鎖數量+1;如果不是,則將該線程封裝在一個Node內,並加入到等待隊列中去。等待被其前一個線程節點喚醒。

抱歉!評論已關閉.