天天看點

美團一面:java中synchronized和ReentrantLock有哪些不同點?

作者:學渣報到

synchronized和ReentranLook有哪些不同點?

美團一面:java中synchronized和ReentrantLock有哪些不同點?

基本

synchronized是文法層面的一個關鍵字,底層是jvm實作的,相當于是C++代碼實作的。ReentrantLock是一個類。

美團一面:java中synchronized和ReentrantLock有哪些不同點?

在使用的時候,synchronized會自動的去幫我們去加鎖、去釋放鎖,而ReentrantLock就需要剛剛說的去調方法,手動加鎖、釋放鎖。但是在使用ReentrantLock的時候,我們要去生成ReentrantLock的對象,然後去調用它的look方法,unlock方法,trylock方法去加鎖、解鎖。

是否公平鎖

synchized的隻能是非公平鎖,而ReentrantLock不一樣,它既可以是公平鎖,也可以是非公平鎖。什麼是公平鎖,什麼是非公平鎖?公平鎖:多個線程按照申請鎖的順序去獲得鎖,線程會直接進入隊列去排隊,永遠都是隊列的第一位才能得到鎖。 公平鎖的優點:所有的線程都能得到資源,不會餓死在隊列中。 缺點:吞吐量會下降很多,隊列裡面除了第一個線程,其他的線程都會阻塞,cpu喚醒阻塞線程的開銷會很大。 非公平鎖:多個線程去擷取鎖的時候,會直接去嘗試擷取,擷取不到,再去進入等待隊列,如果能擷取到,就直接擷取到鎖。

synchronized鎖的是對象,就不管說普通對象還是類對象,都是對象,鎖的資訊是儲存在對象頭。什麼是鎖的資訊呢?就是目前這把鎖是被哪個線程占用了,大家最核心的就是這個資訊。像ReentrantLock是通過一個ReentrantLock對象的state這個屬性來表示這把鎖有沒有被占用到,它通過一個int類型屬性來表示鎖的狀态的。

美團一面:java中synchronized和ReentrantLock有哪些不同點?

是否更新

synchronized底層其實會有一個鎖更新的過程,偏向鎖到輕量級,再到重量級鎖。但是ReentrantLock沒有這個過程,tryLock方法和lock方法,tryLock方法它底層相當于輕量級鎖,會去自旋。lock方法相當于是一個重量級鎖,沒有這個自旋的過程,調哪個方法,它就是哪個鎖。

鎖的狀态總共有四種,級别由低到高依次為:無鎖、偏向鎖、輕量級鎖、重量級鎖,這四種鎖狀态分别代表什麼,為什麼會有鎖更新?其實在 JDK 1.6之前,synchronized 還是一個重量級鎖,是一個效率比較低下的鎖,但是在JDK 1.6後,Jvm為了提高鎖的擷取與釋放效率對(synchronized )進行了優化,引入了 偏向鎖 和 輕量級鎖 ,從此以後鎖的狀态就有了四種(無鎖、偏向鎖、輕量級鎖、重量級鎖),并且四種狀态會随着競争的情況逐漸更新,而且是不可逆的過程,即不可降級,也就是說隻能進行鎖更新(從低級别到進階别),不能鎖降級(進階别到低級别),意味着偏向鎖更新成輕量級鎖後不能降級成偏向鎖。這種鎖更新卻不能降級的政策,目的是為了提高獲得鎖和釋放鎖的效率。

美團一面:java中synchronized和ReentrantLock有哪些不同點?

以上就是這兩個的不同點