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();

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