摘要:它可以設(shè)定一個(gè)閾值,基于此,多個(gè)線程競(jìng)爭(zhēng)獲取許可信號(hào),做自己的申請(qǐng)后歸還,超過(guò)閾值后,線程申請(qǐng)?jiān)S可信號(hào)將會(huì)被阻塞。若該信號(hào)量保證在征用時(shí)按的順序授予許可,則為,否則為例子餐廳個(gè)座位,但是有個(gè)人要等位就餐等位中。。。第個(gè)人吃完了。。
Semaphore簡(jiǎn)介
Semaphore是一種基于計(jì)數(shù)的信號(hào)量。它可以設(shè)定一個(gè)閾值,基于此,多個(gè)線程競(jìng)爭(zhēng)獲取許可信號(hào),做自己的申請(qǐng)后歸還,超過(guò)閾值后,線程申請(qǐng)?jiān)S可信號(hào)將會(huì)被阻塞。Semaphore可以用來(lái)構(gòu)建一些對(duì)象池,資源池之類(lèi)的,比如數(shù)據(jù)庫(kù)連接池,我們也可以創(chuàng)建計(jì)數(shù)為1的Semaphore,將其作為一種類(lèi)似互斥鎖的機(jī)制,這也叫二元信號(hào)量,表示兩種互斥狀態(tài)。它的用法如下:
availablePermits函數(shù)用來(lái)獲取當(dāng)前可用的資源數(shù)量
wc.acquire(); //申請(qǐng)資源
wc.release();// 釋放資源
public Semaphore(int permits,boolean fair)
permits:初始化可用的許可數(shù)目。
fair: 若該信號(hào)量保證在征用時(shí)按FIFO的順序授予許可,則為true,否則為false;
餐廳2個(gè)座位,但是有3個(gè)人要等位就餐
public class SemaphoreThread extends Thread { private String name; private Semaphore semaphore; public SemaphoreThread(String name, Semaphore semaphore) { this.name = name; this.semaphore = semaphore; } @Override public void run() { if (semaphore.availablePermits() <= 0) { System.out.println(name + "等位中。。。"); } try { semaphore.acquire(); System.out.println(name + "開(kāi)始就餐了。。"); Thread.sleep(new Random().nextInt(1000)); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(name + "吃完了。。"); semaphore.release(); } }
請(qǐng)求:
@RequestMapping("test-semaphore") public void testSemaphore() { Semaphore semaphore = new Semaphore(2); for (int i = 1; i <= 3; i++) { new SemaphoreThread("第" + i + "個(gè)人", semaphore).start(); } }
結(jié)果:
第1個(gè)人開(kāi)始就餐了。。
第2個(gè)人開(kāi)始就餐了。。
第3個(gè)人等位中。。。
第1個(gè)人吃完了。。
第3個(gè)人開(kāi)始就餐了。。
第2個(gè)人吃完了。。
第3個(gè)人吃完了。。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/74710.html
摘要:多線程工具箱之前言這一篇談一下信號(hào)量。信息信息信息信息信息信息信息信息信息信息信息小結(jié)適用于多線程請(qǐng)求數(shù)量資源的場(chǎng)景,但無(wú)法解決單多個(gè)線程對(duì)同一資源訪問(wèn)的競(jìng)爭(zhēng)性訪問(wèn)。在后面我們?cè)谖覀兊亩嗑€程工具箱里面陸續(xù)會(huì)提到。 Java多線程工具箱之Semaphore 前言 這一篇談一下Semaphore:信號(hào)量。 將Semaphore類(lèi)比為為信號(hào)燈,被繼承Runable的線程類(lèi)比為列車(chē):理解信號(hào)量...
摘要:當(dāng)線程使用完共享資源后,可以歸還許可,以供其它需要的線程使用。所以,并不會(huì)阻塞調(diào)用線程。立即減少指定數(shù)目的可用許可數(shù)。方法用于將可用許可數(shù)清零,并返回清零前的許可數(shù)六的類(lèi)接口聲明類(lèi)聲明構(gòu)造器接口聲明 showImg(https://segmentfault.com/img/bVbfdnC?w=1920&h=1200); 本文首發(fā)于一世流云的專(zhuān)欄:https://segmentfault...
摘要:所有示例代碼請(qǐng)見(jiàn)下載于基本概念并發(fā)同時(shí)擁有兩個(gè)或者多個(gè)線程,如果程序在單核處理器上運(yùn)行多個(gè)線程將交替地?fù)Q入或者換出內(nèi)存這些線程是同時(shí)存在的,每個(gè)線程都處于執(zhí)行過(guò)程中的某個(gè)狀態(tài),如果運(yùn)行在多核處理器上此時(shí),程序中的每個(gè)線程都 所有示例代碼,請(qǐng)見(jiàn)/下載于 https://github.com/Wasabi1234... showImg(https://upload-images.jians...
摘要:年月日上午阿里云消息服,隊(duì)列消息發(fā)送以及消費(fèi)的并發(fā)測(cè)試解析配置文件二者等價(jià)線程數(shù)并發(fā)數(shù)程序入口準(zhǔn)備工作發(fā)送消息線程池一個(gè)計(jì)數(shù)信號(hào)量。但是,不使用實(shí)際的許可對(duì)象,只對(duì)可用許可的號(hào)碼進(jìn)行計(jì)數(shù),并采取相應(yīng)的行動(dòng)。 package com.study.mq.aliyunmns; import java.io.BufferedInputStream; import java.io.FileIn...
摘要:作用信號(hào)量,限制同一時(shí)間,訪問(wèn)特定資源的線程數(shù)量,以保證合理的使用特定資源。主要方法獲取鎖,如果沒(méi)有獲取到,就堵塞釋放鎖示例運(yùn)行結(jié)果如下可以看出,每次執(zhí)行都是個(gè)。如果把和注釋掉,可以看的結(jié)果如下同一時(shí)間,都打印到了控制臺(tái)。 作用 信號(hào)量,限制同一時(shí)間,訪問(wèn)特定資源的線程數(shù)量,以保證合理的使用特定資源。 主要方法 acquire:獲取鎖,如果沒(méi)有獲取到,就堵塞 release:釋放鎖 ...
閱讀 1836·2021-09-27 14:02
閱讀 3711·2021-09-27 13:36
閱讀 1106·2019-08-30 12:46
閱讀 1905·2019-08-30 10:51
閱讀 3657·2019-08-29 17:02
閱讀 1035·2019-08-29 16:38
閱讀 1905·2019-08-29 16:37
閱讀 3161·2019-08-26 10:32