摘要:為了通過信號(hào)量,線程通過調(diào)用請(qǐng)求許可。許可的數(shù)目是固定的,由此限制了線程通過的數(shù)量。當(dāng)設(shè)置為時(shí)默認(rèn)也是,此類不對(duì)線程獲取許可的順序做任何保證。
【同步器
java.util.concurrent包包含幾個(gè)能幫助人們管理相互合作的線程集的類。這些機(jī)制具有為線程直間的共用集結(jié)點(diǎn)模式提供的‘預(yù)制功能’。如果有一個(gè)相互合作的線程滿足這些行為模式之一,那么應(yīng)該直接使用提供的類庫(kù)而不是顯示的使用鎖與條件的集合。
【信號(hào)量一個(gè)信號(hào)量管理過個(gè)許可證。為了通過信號(hào)量,線程通過調(diào)用acquire()請(qǐng)求許可。其實(shí)沒有實(shí)際的許可對(duì)象,信號(hào)連也僅僅是維護(hù)一個(gè)計(jì)數(shù)器。許可的數(shù)目是固定的,由此限制了線程通過的數(shù)量。當(dāng)一個(gè)線程執(zhí)行完之后,應(yīng)該調(diào)用release()釋放許可證,讓其他線程有機(jī)會(huì)執(zhí)行。事實(shí)上,任意一個(gè)線程都有可以釋放任意個(gè)數(shù)的許可證,這可能會(huì)增加許可證的個(gè)數(shù)。所以我建議,如果不是非常明確的知道為什么要釋放多個(gè)許可證,就一定是讓獲得許可證的線程是放一個(gè)許可證。
【常用方法構(gòu)造函數(shù):
- Semaphore(int permits):創(chuàng)建具有給定許可數(shù)和非公平設(shè)置的Semaphore
- Semaphore(int permits,boolean fair):此類的構(gòu)造方法可選地接受一個(gè)公平 參數(shù)。當(dāng)設(shè)置為 false 時(shí)(默認(rèn)也是false),此類不對(duì)線程獲取許可的順序做任何保證。特別地,闖入是允許的,也就是說可以在已經(jīng)等待的線程前為調(diào)用 acquire() 的線程分配一個(gè)許可,從邏輯上說,就是新線程將自己置于等待線程隊(duì)列的頭部。當(dāng)公平設(shè)置為 true 時(shí),信號(hào)量保證對(duì)于任何調(diào)用獲取方法的線程而言,都按照處理它們調(diào)用這些方法的順序(即先進(jìn)先出;FIFO)來選擇線程、獲得許可。注意,F(xiàn)IFO 排序必然應(yīng)用到這些方法內(nèi)的指定內(nèi)部執(zhí)行點(diǎn)。所以,可能某個(gè)線程先于另一個(gè)線程調(diào)用了 acquire,但是卻在該線程之后到達(dá)排序點(diǎn),并且從方法返回時(shí)也類似。
2. Semaphore還提供一些其他方法:
- int availablePermits() :返回此信號(hào)量中當(dāng)前可用的許可證數(shù)。 - int getQueueLength():返回正在等待獲取許可證的線程數(shù)。 - boolean hasQueuedThreads() :是否有線程正在等待獲取許可證。 - void reducePermits(int reduction) :減少reduction個(gè)許可證。是個(gè)protected方法。 - Collection getQueuedThreads() :返回所有等待獲取許可證的線程集合。是個(gè)protected方法。
當(dāng)許可證的個(gè)數(shù)為1時(shí),可以充當(dāng)互斥鎖使用。
【例子:只能同時(shí)有5個(gè)線程訪問的信號(hào)量import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class SemaTest { public static void main(String[] args) throws InterruptedException { // 線程池 ExecutorService exec = Executors.newFixedThreadPool(20); // 只能5個(gè)線程同時(shí)訪問 final Semaphore semp = new Semaphore(5); // 模擬20個(gè)客戶端訪問 for (int index = 0; index < 20; index++) { final int NO = index; Runnable run = new Runnable() { public void run() { try { //記住這里需要使用while,如果直接用if判斷,那么每個(gè)線程只有一次機(jī)會(huì)去嘗試占有對(duì)象 while (1 == 1){ // 獲取許可 if(semp.tryAcquire()) { System.out.println(Thread.currentThread().getName() + " 【 Access: " + NO); Thread.sleep(100); // 訪問完后,釋放 semp.release(); System.out.println(Thread.currentThread().getName() + " 【 Release: " + NO); System.out.println("----------------- 【 " + Thread.currentThread().getName() + "】" + semp.availablePermits()); break; }else{ System.out.println(Thread.currentThread().getName() + " 【 NOT Access: " + NO); Thread.sleep(100); } } } catch (Exception e) { e.printStackTrace(); } } }; exec.execute(run); } //讓子線程有充分時(shí)間運(yùn)行完 Thread.sleep(1000); exec.shutdown(); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/68091.html
摘要:創(chuàng)建線程的方式方式一將類聲明為的子類。將該線程標(biāo)記為守護(hù)線程或用戶線程。其中方法隱含的線程為父線程?;謴?fù)線程,已過時(shí)。等待該線程銷毀終止。更多的使當(dāng)前線程在鎖存器倒計(jì)數(shù)至零之前一直等待,除非線 知識(shí)體系圖: showImg(https://segmentfault.com/img/bVbef6v?w=1280&h=960); 1、線程是什么? 線程是進(jìn)程中獨(dú)立運(yùn)行的子任務(wù)。 2、創(chuàng)建線...
摘要:多線程編程這篇文章分析了多線程的優(yōu)缺點(diǎn),如何創(chuàng)建多線程,分享了線程安全和線程通信線程池等等一些知識(shí)。 中間件技術(shù)入門教程 中間件技術(shù)入門教程,本博客介紹了 ESB、MQ、JMS 的一些知識(shí)... SpringBoot 多數(shù)據(jù)源 SpringBoot 使用主從數(shù)據(jù)源 簡(jiǎn)易的后臺(tái)管理權(quán)限設(shè)計(jì) 從零開始搭建自己權(quán)限管理框架 Docker 多步構(gòu)建更小的 Java 鏡像 Docker Jav...
摘要:本文探討并發(fā)中的其它問題線程安全可見性活躍性等等。當(dāng)閉鎖到達(dá)結(jié)束狀態(tài)時(shí),門打開并允許所有線程通過。在從返回時(shí)被叫醒時(shí),線程被放入鎖池,與其他線程競(jìng)爭(zhēng)重新獲得鎖。 本文探討Java并發(fā)中的其它問題:線程安全、可見性、活躍性等等。 在行文之前,我想先推薦以下兩份資料,質(zhì)量很高:極客學(xué)院-Java并發(fā)編程讀書筆記-《Java并發(fā)編程實(shí)戰(zhàn)》 線程安全 《Java并發(fā)編程實(shí)戰(zhàn)》中提到了太多的術(shù)語...
摘要:并發(fā)編程導(dǎo)論是對(duì)于分布式計(jì)算并發(fā)編程系列的總結(jié)與歸納。并發(fā)編程導(dǎo)論隨著硬件性能的迅猛發(fā)展與大數(shù)據(jù)時(shí)代的來臨,并發(fā)編程日益成為編程中不可忽略的重要組成部分。并發(fā)編程復(fù)興的主要驅(qū)動(dòng)力來自于所謂的多核危機(jī)。 并發(fā)編程導(dǎo)論是對(duì)于分布式計(jì)算-并發(fā)編程 https://url.wx-coder.cn/Yagu8 系列的總結(jié)與歸納。歡迎關(guān)注公眾號(hào):某熊的技術(shù)之路。 showImg(https://...
閱讀 1518·2021-11-11 16:54
閱讀 9865·2021-11-02 14:44
閱讀 2440·2021-10-22 09:53
閱讀 3325·2019-08-30 11:18
閱讀 2012·2019-08-29 13:29
閱讀 2076·2019-08-27 10:58
閱讀 1704·2019-08-26 11:38
閱讀 3586·2019-08-26 10:31