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