JUC包中的鎖,包括:Lock接口,ReadWriteLock接口,LockSupport阻塞原語,Condition條件,AbstractOwnableSynchronizer/AbstractQueuedSynchronizer/AbstractQueuedLongSynchronizer三個抽象類,ReentrantLock獨佔鎖,ReentrantReadWriteLock讀寫鎖。因爲CountDownLatch,CyclicBarrier和Semaphore也是經過AQS來實現的;所以,我也將它們概括到鎖的框架中進行介紹。html
先看看鎖的框架圖,以下所示。程序員
01. Lock接口多線程
JUC包中的 Lock 接口支持那些語義不一樣(重入、公平等)的鎖規則。所謂語義不一樣,是指鎖但是有"公平機制的鎖"、"非公平機制的鎖"、"可重入的鎖"等等。"公平機制"是指"不一樣線程獲取鎖的機制是公平的",而"非公平機制"則是指"不一樣線程獲取鎖的機制是非公平的","可重入的鎖"是指同一個鎖可以被一個線程屢次獲取。框架
02. ReadWriteLockui
ReadWriteLock 接口以和Lock相似的方式定義了一些讀取者能夠共享而寫入者獨佔的鎖。JUC包只有一個類實現了該接口,即 ReentrantReadWriteLock,由於它適用於大部分的標準用法上下文。但程序員能夠建立本身的、適用於非標準要求的實現。線程
03. AbstractOwnableSynchronizer/AbstractQueuedSynchronizer/AbstractQueuedLongSynchronizer
AbstractQueuedSynchronizer就是被稱之爲AQS的類,它是一個很是有用的超類,可用來定義鎖以及依賴於排隊阻塞線程的其餘同步器;ReentrantLock,ReentrantReadWriteLock,CountDownLatch,CyclicBarrier和Semaphore等這些類都是基於AQS類實現的。AbstractQueuedLongSynchronizer 類提供相同的功能但擴展了對同步狀態的 64 位的支持。二者都擴展了類 AbstractOwnableSynchronizer(一個幫助記錄當前保持獨佔同步的線程的簡單類)。htm
04. LockSupport
LockSupport提供「建立鎖」和「其餘同步類的基本線程阻塞原語」。
LockSupport的功能和"Thread中的Thread.suspend()和Thread.resume()有點相似",LockSupport中的park() 和 unpark() 的做用分別是阻塞線程和解除阻塞線程。可是park()和unpark()不會遇到「Thread.suspend 和 Thread.resume所可能引起的死鎖」問題。對象
05. Condition
Condition須要和Lock聯合使用,它的做用是代替Object監視器方法,能夠經過await(),signal()來休眠/喚醒線程。
Condition 接口描述了可能會與鎖有關聯的條件變量。這些變量在用法上與使用 Object.wait 訪問的隱式監視器相似,但提供了更強大的功能。須要特別指出的是,單個 Lock 可能與多個 Condition 對象關聯。爲了不兼容性問題,Condition 方法的名稱與對應的 Object 版本中的不一樣。blog
06. ReentrantLock
ReentrantLock是獨佔鎖。所謂獨佔鎖,是指只能被獨自佔領,即同一個時間點只能被一個線程鎖獲取到的鎖。ReentrantLock鎖包括"公平的ReentrantLock"和"非公平的ReentrantLock"。"公平的ReentrantLock"是指"不一樣線程獲取鎖的機制是公平的",而"非公平的 ReentrantLock"則是指"不一樣線程獲取鎖的機制是非公平的",ReentrantLock是"可重入的鎖"。
ReentrantLock的UML類圖以下:繼承
(01) ReentrantLock實現了Lock接口。
(02) ReentrantLock中有一個成員變量sync,sync是Sync類型;Sync是一個抽象類,並且它繼承於AQS。
(03) ReentrantLock中有"公平鎖類"FairSync和"非公平鎖類"NonfairSync,它們都是Sync的子類。ReentrantLock中sync對象,是FairSync與NonfairSync中的一種,這也意味着ReentrantLock是"公平鎖"或"非公平鎖"中的一種,ReentrantLock默認是非公平鎖。
07. ReentrantReadWriteLock
ReentrantReadWriteLock是讀寫鎖接口ReadWriteLock的實現類,它包括子類ReadLock和WriteLock。ReadLock是共享鎖,而WriteLock是獨佔鎖。
ReentrantReadWriteLock的UML類圖以下:
(01) ReentrantReadWriteLock實現了ReadWriteLock接口。
(02) ReentrantReadWriteLock中包含sync對象,讀鎖readerLock和寫鎖writerLock。讀鎖ReadLock和寫鎖WriteLock都實現了Lock接口。
(03) 和"ReentrantLock"同樣,sync是Sync類型;並且,Sync也是一個繼承於AQS的抽象類。Sync也包括"公平鎖"FairSync和"非公平鎖"NonfairSync。
08. CountDownLatch
CountDownLatch是一個同步輔助類,在完成一組正在其餘線程中執行的操做以前,它容許一個或多個線程一直等待。
CountDownLatch的UML類圖以下:
CountDownLatch包含了sync對象,sync是Sync類型。CountDownLatch的Sync是實例類,它繼承於AQS。
09. CyclicBarrier
CyclicBarrier是一個同步輔助類,容許一組線程互相等待,直到到達某個公共屏障點 (common barrier point)。由於該 barrier 在釋放等待線程後能夠重用,因此稱它爲循環 的 barrier。
CyclicBarrier的UML類圖以下:
CyclicBarrier是包含了"ReentrantLock對象lock"和"Condition對象trip",它是經過獨佔鎖實現的。
CyclicBarrier和CountDownLatch的區別是:
(01) CountDownLatch的做用是容許1或N個線程等待其餘線程完成執行;而CyclicBarrier則是容許N個線程相互等待。
(02) CountDownLatch的計數器沒法被重置;CyclicBarrier的計數器能夠被重置後使用,所以它被稱爲是循環的barrier。
10. Semaphore
Semaphore是一個計數信號量,它的本質是一個"共享鎖"。
信號量維護了一個信號量許可集。線程能夠經過調用acquire()來獲取信號量的許可;當信號量中有可用的許可時,線程能獲取該許可;不然線程必須等待,直到有可用的許可爲止。 線程能夠經過release()來釋放它所持有的信號量許可。
Semaphore的UML類圖以下:
和"ReentrantLock"同樣,Semaphore包含了sync對象,sync是Sync類型;並且,Sync也是一個繼承於AQS的抽象類。Sync也包括"公平信號量"FairSync和"非公平信號量"NonfairSync。