一、前言
在分析完了集合框架后,很有必要接着分析java並發包下面的源碼,JUC(java.util.concurrent)源碼也是我們學習Java邁進一步的重要過程。我們分為幾個模塊進行分析,首先是對鎖模塊的分析。
二、鎖框架圖
在Java並發中,鎖是最重要的一個工具,因為鎖,才能實現正確的並發訪問,所以,先從鎖入手一步步進行分析,鎖的框架圖如下。
說明:在鎖結構框架中乃至並發框架中,AbstractQueuedSynchronizer都占有舉足輕重的地位,同時LockSupport也是非常重要的類。
三、具體說明
3.1 Condition
Condition為接口類型,它將 Object 監視器方法(wait、notify 和 notifyAll)分解成截然不同的對象,以便通過將這些對象與任意 Lock 實現組合使用,為每個對象提供多個等待 set (wait-set)。其中,Lock 替代了 synchronized 方法和語句的使用,Condition 替代了 Object 監視器方法的使用。可以通過await(),signal()來休眠/喚醒線程。
3.2 Lock
Lock為接口類型,Lock實現提供了比使用synchronized
方法和語句可獲得的更廣泛的鎖定操作。此實現允許更靈活的結構,可以具有差別很大的屬性,可以支持多個相關的Condition對象。
3.3 ReadWriteLock
ReadWriteLock為接口類型, 維護了一對相關的鎖,一個用於只讀操作,另一個用於寫入操作。只要沒有 writer,讀取鎖可以由多個 reader 線程同時保持。寫入鎖是獨占的。
3.4 AbstractOwnableSynchonizer
AbstractOwnableSynchonizer為抽象類,可以由線程以獨占方式擁有的同步器。此類為創建鎖和相關同步器(伴隨着所有權的概念)提供了基礎。AbstractOwnableSynchronizer 類本身不管理或使用此信息。但是,子類和工具可以使用適當維護的值幫助控制和監視訪問以及提供診斷。
3.5 AbstractQueuedLongSynchronizer
AbstractQueuedLongSynchronizer為抽象類,以 long 形式維護同步狀態的一個 AbstractQueuedSynchronizer 版本。此類具有的結構、屬性和方法與 AbstractQueuedSynchronizer 完全相同,但所有與狀態相關的參數和結果都定義為 long 而不是 int。當創建需要 64 位狀態的多級別鎖和屏障等同步器時,此類很有用。
3.6 AbstractQueuedSynchonizer
AbstractQueuedSynchonizer為抽象類,其為實現依賴於先進先出 (FIFO) 等待隊列的阻塞鎖和相關同步器(信號量、事件,等等)提供一個框架。此類的設計目標是成為依靠單個原子 int 值來表示狀態的大多數同步器的一個有用基礎。
3.7 LockSupport
LockSupport為常用類,用來創建鎖和其他同步類的基本線程阻塞原語。LockSupport的功能和"Thread中的 Thread.suspend()和Thread.resume()有點類似",LockSupport中的park() 和 unpark() 的作用分別是阻塞線程和解除阻塞線程。但是park()和unpark()不會遇到“Thread.suspend 和 Thread.resume所可能引發的死鎖”問題。
3.8 CountDownLatch
CountDownLatch為常用類,它 是一個同步輔助類,在完成一組正在其他線程中執行的操作之前,它允許一個或多個線程一直等待。
3.9 Semaphore
Semaphore為常用類,其是一個計數信號量,從概念上講,信號量維護了一個許可集。如有必要,在許可可用前會阻塞每一個 acquire(),然后再獲取該許可。每個 release() 添加一個許可,從而可能釋放一個正在阻塞的獲取者。但是,不使用實際的許可對象,Semaphore 只對可用許可的號碼進行計數,並采取相應的行動。通常用於限制可以訪問某些資源(物理或邏輯的)的線程數目。
3.10 CyclicBarrier
CyclicBarrier為常用類,其是一個同步輔助類,它允許一組線程互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的線程的程序中,這些線程必須不時地互相等待,此時 CyclicBarrier 很有用。因為該 barrier 在釋放等待線程后可以重用,所以稱它為循環 的 barrier。
3.11 ReentrantLock
ReentrantLock為常用類,它是一個可重入的互斥鎖 Lock,它具有與使用 synchronized 方法和語句所訪問的隱式監視器鎖相同的一些基本行為和語義,但功能更強大。
3.12 ReentrantReadWriteLock
ReentrantReadWriteLock是讀寫鎖接口ReadWriteLock的實現類,它包括Lock子類ReadLock和WriteLock。ReadLock是共享鎖,WriteLock是獨占鎖。
四、總結
JUC中鎖框架就介紹到這里,之后會進一步結合源碼和示例進行分析,謝謝各位園友的觀看~