<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
semaphore
中文意思既是號誌,它的主要功能就是用來控制某個資源同時被存取的執行緒數。
為了控制某塊資源的並行存取量時,可以使用Semaphore
物件中的acquire()
方法獲取存取令牌,如果Semaphore
物件存取令牌已發完,那麼當前獲取令牌的執行緒將會進入阻塞,帶其他執行緒進行release()
釋放令牌時,當前執行緒才有機會獲得令牌從而擁有存取許可權。
Semaphore
實際上是一種共用鎖,因為它允許多個執行緒並行獲取共用的資源。在Semaphore
物件建立時必須設定可用令牌的初始數量permits
,用於控制並行時同時獲取資源許可權的執行緒數量。在Semaphore
類中繼承了同步佇列AbstractQueuedSynchronizer
,在此類中有個屬性state
用於標記當前並行的佇列數,也就是獲取令牌的執行緒數,那麼在進行acquire()
的時候,就會嘗試獲取共用鎖,獲取鎖成功後state
值將加1,如果state
值已經達到permits
時就表示令牌已派發完,當前執行緒將進入阻塞狀態,待其他執行緒進行release()
時state
值將減1,此時就會從佇列中獲取頭部執行緒進行喚醒讓其獲得令牌進行資源存取。
如下圖,仔細檢視原始碼就會發現Semaphore
實際上就是重寫了AbstractQueuedSynchronizer
中的tryAcquireShared()
、tryReleaseShared()
方法來實現的。
Semaphore
過載了兩個建構函式,其一是Semaphore(int permits)
直接指定令牌數,預設為非公平鎖;其二是Semaphore(int permits,boolean fair)
,fair引數即表示執行緒搶佔令牌的公平性,true為公平鎖,否則為非公平鎖。acquire()
無參表示預設獲取一個令牌,acquire(int permits)
表示獲取指定permits
數量的令牌數,如果令牌不夠,則當前執行緒進入阻塞狀態。tryAcquire()
無參表示嘗試獲取一個令牌,該方法是非阻塞的,所以如果令牌數不夠獲取失敗返回false,否則就返回true;同時也過載了方法tryAcquire(int permits)
指定獲取令牌數,tryAcquire(int permits, long timeout, TimeUnit unit)
在有效時間內嘗試獲取指定數量的令牌數,如果超時仍未獲取到令牌則返回false,否則返回true。 release
同上支援無參與帶參指定釋放令牌數的方法。 drainPermits()
獲取剩下的可用令牌。 hasQueuedThread()
用於判斷當前Semaphare範例中是否存在等待獲取令牌的執行緒。
分析一下下面這段簡短的程式碼,首先是建立一個號誌為5的Semaphore
物件,然後在建立一個執行緒池(這裡為了演示方便,實際開發中不建議使用此執行緒池建立),利用for迴圈並行執行100個執行緒,當執行緒執行時優先獲取一個令牌,線上程中的業務程式碼裡我們做了1秒的休眠,為了展示等待獲取令牌的效果,在延遲1秒執行完業務程式碼時進行令牌釋放,後續的執行緒才能逐個被喚醒獲取令牌存取共用資源。
@Slf4j public class SemaphoreDemo { public static void main(String[] args) { Semaphore semaphore = new Semaphore(5); ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 0; i < 100; i++) { executorService.execute(() -> { try { semaphore.acquire(); log.info("成功獲取令牌"); TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } finally { log.info("釋放令牌"); semaphore.release(); } }); } executorService.shutdown(); } }
由下圖執行結果可見,100個執行緒並行並不是一次性都執行完的,而是要等待前面的執行緒釋放令牌後等待的執行緒才可以獲取令牌進行業務程式碼的執行。
Semaphore
主要是運用在多執行緒環境中對某一些共用資源的存取量限制,防止多個執行緒並行存取同一資源,可能會導致大多數執行緒獲取資源時都需要進行加鎖,那如果是獲取資料庫中的資料,那麼就可以緩解資料庫的壓力。
另一種情況是用於多執行緒執行的一個流量限制,一般情況下我們可能會通過執行緒池做一步執行緒數的控制,但是某些業務為了減輕CPU的負擔,還是會做一些同時執行執行緒數的限制。
到此這篇關於Java中的Semaphore如何使用的文章就介紹到這了,更多相關Semaphore使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45