Java併發-synchronized與ReentrantLock之間的選擇

可重入

ReentrantLock和synchronized其實都是可重入的鎖。兩者都是同一個線程每進入一次,鎖的計數器都自增1,所以要等到鎖的計數器下降爲0時才能釋放鎖。

實現

synchronized是依賴JVM實現的,而ReentrantLock是JDK實現的

性能

synchronized優化以前,性能比ReentrantLock差很多。自從Synchronized引入了偏向鎖,輕量級鎖(自旋鎖)後,兩者的性能就差不多了,在兩種方法都可用的情況下,官方甚至建議使用synchronized。

功能

便利性:很明顯Synchronized的使用比較方便簡潔,並且由編譯器去保證鎖的加鎖和釋放,而ReenTrantLock需要手工聲明來加鎖和釋放鎖,爲了避免忘記手工釋放鎖造成死鎖,所以需要在finally中聲明釋放鎖。
鎖的細粒度和靈活度:很明顯ReentrantLock優於Synchronized

ReentrantLock特別之處

  1. ReenTrantLock可以指定是公平鎖還是非公平鎖。而synchronized只能是非公平鎖。所謂的公平鎖就是先等待的線程先獲得鎖。非公平鎖性能比公平鎖性能好,非公平鎖則允許“插隊“:當一個線程請求非公平鎖時,如果在發出請求的同時該鎖的狀態變爲可用,那麼這個線程將跳過隊列中所有的等待線程並獲得這個鎖。

  2. ReenTrantLock提供了一個Condition(條件)類,用來實現分組喚醒需要喚醒的線程們,而不是像synchronized要麼隨機喚醒一個線程要麼喚醒全部線程。

  3. ReenTrantLock提供了一種能夠中斷等待鎖的線程的機制,通過lock.lockInterruptibly()來實現這個機制。

ReenTrantLock的實現是一種自旋鎖,通過循環調用CAS操作來實現加鎖。它的性能比較好也是因爲避免了使線程進入內核態的阻塞狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章