1. 程式人生 > >顯式鎖(java.util.Concurrent)

顯式鎖(java.util.Concurrent)

一、前言

  在分析完了集合框架後,很有必要接著分析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是獨佔鎖。