Java核心知識 多線程併發 Semaphore信號量 (十一)

Java核心知識 多線程併發 Semaphore信號量 (十一)

Semaphore 是一種基於計數的信號量。它可以設定一個閾值,基於此,多個線程競爭獲取許可信 號,做完自己的申請後歸還,超過閾值後,線程申請許可信號將會被阻塞。Semaphore 可以用來 構建一些對象池,資源池之類的,比如數據庫連接池

實現互斥鎖(計數器為 1)

我們也可以創建計數為 1 的 Semaphore,將其作為一種類似互斥鎖的機制,這也叫二元信號量, 表示兩種互斥狀態。

代碼實現

它的用法如下:

Java核心知識 多線程併發 Semaphore信號量 (十一)


Java核心知識 多線程併發 Semaphore信號量 (十一)

Semaphore 與 ReentrantLock

Semaphore 基本能完成 ReentrantLock 的所有工作,使用方法也與之類似,通過 acquire()與 release()方法來獲得和釋放臨界資源。經實測,Semaphone.acquire()方法默認為可響應中斷鎖, 與 ReentrantLock.lockInterruptibly()作用效果一致,也就是說在等待臨界資源的過程中可以被 Thread.interrupt()方法中斷。

此外,Semaphore 也實現了可輪詢的鎖請求與定時鎖的功能,除了方法名 tryAcquire 與 tryLock 不同,其使用方法與 ReentrantLock 幾乎一致。Semaphore 也提供了公平與非公平鎖的機制,也 可在構造函數中進行設定。

Semaphore 的鎖釋放操作也由手動進行,因此與 ReentrantLock 一樣,為避免線程因拋出異常而 無法正常釋放鎖的情況發生,釋放鎖的操作也必須在 finally 代碼塊中完成。

AtomicInteger

首 先 說 明 , 此 處 AtomicInteger , 一 個 提 供 原 子 操 作 的 Integer 的類, 常 見 的 還 有 AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference 等,他們的實現原理相同, 區別在與運算對象類型的不同。令人興奮地,還可以通過 AtomicReference將一個對象的所 有操作轉化成原子操作。

我們知道,在多線程程序中,諸如++i 或 i++等運算不具有原子性,是不安全的線程操作之一。 通常我們會使用 synchronized 將該操作變成一個原子操作,但 JVM 為此類操作特意提供了一些 同步類,使得使用更方便,且使程序運行效率變得更高。通過相關資料顯示,通常 AtomicInteger 的性能是 ReentantLock 的好幾倍。


分享到:


相關文章: