Java併發源碼之ReentrantLock

ReentrantLock介紹

ReentrantLock是一個可重入的互斥鎖,與使用synchronized方法和語句訪問的隱式監視鎖具備相同的基本行爲和語義,但具備擴展功能。ReentrantLock屬於最後一個成功加鎖而且尚未釋放鎖的線程。當一個線程請求lock時,若是鎖不屬於任何線程,將立馬獲得這個鎖;若是鎖已經被當前線程擁有,當前線程會當即返回。併發

下面這個圖是與ReentrantLock相關的UML類圖,能夠看到ReentrantLock實現了Lock和Serializable接口,表示它實現了lock()、unlock()等Lock的接口方法,而且是一個能夠序列化的類。ReentrantLock主要成員變量爲Sync,Sync是一個抽象類,繼承了AbstractQueuedSynchronizer(簡稱AQS),AQS提供了一個基於FIFO隊列,能夠用於構建鎖或者其餘相關同步裝置的基礎框架,本文不詳細介紹。而Sync有兩個實現類:NonfairSync和FairSync,分別表明非公平鎖和公平鎖。也就是說ReentrantLock中全部的鎖操做都是由sync這個成員變量完成的。框架

Java併發源碼之ReentrantLock(一)

ReentrantLock構造方法

下面的代碼爲它的構造函數,能夠看到無參構造函數直接返回非公平鎖。函數

Java併發源碼之ReentrantLock(一)

ReentrantLock加鎖方法spa

下面是三個經常使用的ReentrantLock加鎖方法,分別爲lock、tryLock、lockInterruptibly。線程

Java併發源碼之ReentrantLock(一)

Java併發源碼之ReentrantLock(一)

Java併發源碼之ReentrantLock(一)

上面代碼的註釋已經很明白,這裏我總結一下:3d

  1. lock:拿不到lock就不會結束,否則線程就一直等待blog

  2. tryLock:立刻返回,拿到lock返回true,不然返回false繼承

  3. lockInterruptibly:線程在請求lock並被阻塞時,若是被中斷,則此線程會被喚醒並被要求處理InterruptedException。而且若是線程已經被interrupt,再使用lockInterruptibly的時候,此線程也會被要求處理interruptedException接口

ReentrantLock釋放鎖方法

ReentrantLock的釋放鎖方法比較簡單,只有一個unlock。下面是它的說明。隊列

Java併發源碼之ReentrantLock(一)

ReentrantLock其餘方法

下面列出了ReentrantLock的其餘方法都比較好理解。

Java併發源碼之ReentrantLock(一)

Java併發源碼之ReentrantLock(一)

Java併發源碼之ReentrantLock(一)

Java併發源碼之ReentrantLock(一)

Java併發源碼之ReentrantLock(一)

總結一下

本文僅僅是對ReentrantLock作了簡單的介紹,包括主要結構和主要方法。經過上面的描述能夠看到,ReentrantLock全部的方法都交給了它的sync成員變量來完成。接下來將會對公平鎖和非公平鎖進行分析。

相關文章
相關標籤/搜索