ReentrantLock是一個可重入的互斥鎖,與使用synchronized方法和語句訪問的隱式監視鎖具備相同的基本行爲和語義,但具備擴展功能。ReentrantLock屬於最後一個成功加鎖而且尚未釋放鎖的線程。當一個線程請求lock時,若是鎖不屬於任何線程,將立馬獲得這個鎖;若是鎖已經被當前線程擁有,當前線程會當即返回。併發
下面這個圖是與ReentrantLock相關的UML類圖,能夠看到ReentrantLock實現了Lock和Serializable接口,表示它實現了lock()、unlock()等Lock的接口方法,而且是一個能夠序列化的類。ReentrantLock主要成員變量爲Sync,Sync是一個抽象類,繼承了AbstractQueuedSynchronizer(簡稱AQS),AQS提供了一個基於FIFO隊列,能夠用於構建鎖或者其餘相關同步裝置的基礎框架,本文不詳細介紹。而Sync有兩個實現類:NonfairSync和FairSync,分別表明非公平鎖和公平鎖。也就是說ReentrantLock中全部的鎖操做都是由sync這個成員變量完成的。框架
下面的代碼爲它的構造函數,能夠看到無參構造函數直接返回非公平鎖。函數
ReentrantLock加鎖方法spa
下面是三個經常使用的ReentrantLock加鎖方法,分別爲lock、tryLock、lockInterruptibly。線程
上面代碼的註釋已經很明白,這裏我總結一下:3d
lock:拿不到lock就不會結束,否則線程就一直等待blog
tryLock:立刻返回,拿到lock返回true,不然返回false繼承
lockInterruptibly:線程在請求lock並被阻塞時,若是被中斷,則此線程會被喚醒並被要求處理InterruptedException。而且若是線程已經被interrupt,再使用lockInterruptibly的時候,此線程也會被要求處理interruptedException接口
ReentrantLock的釋放鎖方法比較簡單,只有一個unlock。下面是它的說明。隊列
下面列出了ReentrantLock的其餘方法都比較好理解。
本文僅僅是對ReentrantLock作了簡單的介紹,包括主要結構和主要方法。經過上面的描述能夠看到,ReentrantLock全部的方法都交給了它的sync成員變量來完成。接下來將會對公平鎖和非公平鎖進行分析。