synchronized和ReentrantLock區別

一.什麼是sychronizedjava

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

在修飾代碼塊的時候須要一個reference對象做爲鎖的對象.spa

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

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


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


二.什麼ReentrantLockit

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

三.synchronized和ReentrantLock的區別構造函數

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

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

1.等待可中斷

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

2.公平鎖

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

3.綁定多個Condition

經過屢次newCondition能夠得到多個Condition對象,能夠簡單的實現比較複雜的線程同步的功能.經過await(),signal();

相關文章
相關標籤/搜索