一.什麼是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();