synchronized和ReentrantLock的區別

一.什麼是sychronized


sychronized是java中最基本同步互斥的手段,可以修飾代碼塊,方法,類.


在修飾代碼塊的時候需要一個reference對象作爲鎖的對象.


在修飾方法的時候默認是當前對象作爲鎖的對象.


在修飾類時候默認是當前類的Class對象作爲鎖的對象.






synchronized會在進入同步塊的前後分別形成monitorenter和monitorexit字節碼指令.在執行monitorenter指令時會嘗試獲取對象的鎖,如果此沒對象沒有被鎖,或者此對象已經被當前線程鎖住,那麼鎖的計數器加一,每當monitorexit被鎖的對象的計數器減一.直到爲0就釋放該對象的鎖.由此synchronized是可重入的,不會出現自己把自己鎖死.






二.什麼ReentrantLock


以對象的方式來操作對象鎖.相對於sychronized需要在finally中去釋放鎖 


三.synchronized和ReentrantLock的區別


除了synchronized的功能,多了三個高級功能.


等待可中斷,公平鎖,綁定多個Condition.


1.等待可中斷


在持有鎖的線程長時間不釋放鎖的時候,等待的線程可以選擇放棄等待.   tryLock(long timeout, TimeUnit unit)


2.公平鎖


按照申請鎖的順序來一次獲得鎖稱爲公平鎖.synchronized的是非公平鎖,ReentrantLock可以通過構造函數實現公平鎖.    new RenentrantLock(boolean fair)


3.綁定多個Condition


通過多次newCondition可以獲得多個Condition對象,可以簡單的實現比較複雜的線程同步的功能.通過await(),signal();

發佈了8 篇原創文章 · 獲贊 4 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章