最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的Semaphore信號(hào)量簡(jiǎn)析

 更新時(shí)間:2023年12月16日 09:07:12   作者:小晨想好好學(xué)習(xí)  
這篇文章主要介紹了Java中的Semaphore信號(hào)量簡(jiǎn)析,Semaphore:信號(hào)量,用來限制能同時(shí)訪問共享資源的線程上限,使用Semaphore實(shí)現(xiàn)簡(jiǎn)單連接池,對(duì)比享元模式下的實(shí)現(xiàn)(用wait和notify),性能和可讀性要更好,需要的朋友可以參考下

一、是什么?

Semaphore:信號(hào)量,用來限制能同時(shí)訪問共享資源的線程上限

二、簡(jiǎn)單使用

public class TestSemaphore {
    public static void main(String[] args) {
        // 1. 創(chuàng)建 semaphore 對(duì)象
        Semaphore semaphore = new Semaphore(3);
        // 2. 10個(gè)線程同時(shí)運(yùn)行
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                try {
                    semaphore.acquire();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                try {
                    log.debug("running...");
                    sleep(1);
                    log.debug("end...");
                } finally {
                    semaphore.release();
                }
            }).start();
        }
    }
}

結(jié)果:始終只有三個(gè)線程處于正在運(yùn)行的狀態(tài)

在這里插入圖片描述

三、semaphore應(yīng)用

  • 使用semaphore限流,在訪問高峰期時(shí),讓請(qǐng)求線程阻塞。當(dāng)然它只適合限制單機(jī)線程數(shù)量,并且是僅限制線程數(shù),而不是限制資源數(shù)(例如連接數(shù))
  • 使用Semaphore實(shí)現(xiàn)簡(jiǎn)單連接池,對(duì)比享元模式下的實(shí)現(xiàn)(用wait和notify),性能和可讀性要更好
class Pool {
    // 1. 連接池大小
    private final int poolSize;
    // 2. 連接對(duì)象數(shù)組
    private Connection[] connections;
    // 3. 連接狀態(tài)數(shù)組 0 表示空閑, 1 表示繁忙
    private AtomicIntegerArray states;
    private Semaphore semaphore;
    // 4. 構(gòu)造方法初始化
    public Pool(int poolSize) {
        this.poolSize = poolSize;
        // 讓許可數(shù)與資源數(shù)一致
        this.semaphore = new Semaphore(poolSize);
        this.connections = new Connection[poolSize];
        this.states = new AtomicIntegerArray(new int[poolSize]);
        for (int i = 0; i < poolSize; i++) {
            connections[i] = new MockConnection("連接" + (i+1));
        }
    }
    // 5. 借連接
    public Connection borrow() {// t1, t2, t3
        // 獲取許可
        try {
            semaphore.acquire(); // 沒有許可的線程,在此等待
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for (int i = 0; i < poolSize; i++) {
            // 獲取空閑連接
            if(states.get(i) == 0) {
                if (states.compareAndSet(i, 0, 1)) {
                    log.debug("borrow {}", connections[i]);
                    return connections[i];
                }
            }
        }
        // 不會(huì)執(zhí)行到這里
        return null;
    }
    // 6. 歸還連接
    public void free(Connection conn) {
        for (int i = 0; i < poolSize; i++) {
            if (connections[i] == conn) {
                states.set(i, 0);
                log.debug("free {}", conn);
                semaphore.release();
                break;
            }
        }
    }
}

四、Semaphore原理

在這里插入圖片描述

在這里插入圖片描述

到此這篇關(guān)于Java中的Semaphore信號(hào)量簡(jiǎn)析的文章就介紹到這了,更多相關(guān)Semaphore信號(hào)量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Cloud Config分布式配置中心使用介紹詳解

    Spring Cloud Config分布式配置中心使用介紹詳解

    分布式配置中心應(yīng)用場(chǎng)景 往往,我們使用配置文件管理?些配置信息,比如application.yml 單體應(yīng)用架構(gòu):配置信息的管理、維護(hù)并不會(huì)顯得特別麻煩,手動(dòng)操作就可以,因?yàn)榫鸵粋€(gè)工程
    2022-09-09
  • 詳解Java的內(nèi)置異常以及創(chuàng)建自定義異常子類的方法

    詳解Java的內(nèi)置異常以及創(chuàng)建自定義異常子類的方法

    這篇文章主要介紹了詳解Java的內(nèi)置異常以及創(chuàng)建自定義異常子類的方法,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • JAVA實(shí)現(xiàn) SpringMVC方式的微信接入、實(shí)現(xiàn)簡(jiǎn)單的自動(dòng)回復(fù)功能

    JAVA實(shí)現(xiàn) SpringMVC方式的微信接入、實(shí)現(xiàn)簡(jiǎn)單的自動(dòng)回復(fù)功能

    這篇文章主要介紹了JAVA實(shí)現(xiàn) SpringMVC方式的微信接入、實(shí)現(xiàn)簡(jiǎn)單的自動(dòng)回復(fù)功能的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-11-11
  • 如何解決SpringBoot2.6及之后版本取消了循環(huán)依賴的支持問題

    如何解決SpringBoot2.6及之后版本取消了循環(huán)依賴的支持問題

    循環(huán)依賴指的是兩個(gè)或者多個(gè)bean之間相互依賴,形成一個(gè)閉環(huán),SpringBoot從2.6.0開始默認(rèn)不允許出現(xiàn)Bean循環(huán)引用,解決方案包括在全局配置文件設(shè)置允許循環(huán)引用存在、在SpringApplicationBuilder添加設(shè)置允許循環(huán)引用、構(gòu)造器注入
    2024-10-10
  • SpringBoot+Mybatis-Plus實(shí)現(xiàn)mysql讀寫分離方案的示例代碼

    SpringBoot+Mybatis-Plus實(shí)現(xiàn)mysql讀寫分離方案的示例代碼

    這篇文章主要介紹了SpringBoot+Mybatis-Plus實(shí)現(xiàn)mysql讀寫分離方案的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Maven搭建springboot項(xiàng)目的方法步驟

    Maven搭建springboot項(xiàng)目的方法步驟

    這篇文章主要介紹了Maven搭建springboot項(xiàng)目的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • IntelliJ IDEA配置Maven阿里云鏡像加速源的全流程

    IntelliJ IDEA配置Maven阿里云鏡像加速源的全流程

    國(guó)內(nèi)網(wǎng)絡(luò)訪問 Maven 中央倉(cāng)庫(kù)經(jīng)常超時(shí)、依賴下載極慢或失敗,配置阿里云等國(guó)內(nèi)鏡像后,Java 項(xiàng)目依賴下載飛快,極大提升開發(fā)效率,是中國(guó)開發(fā)者必做優(yōu)化,本文就給大家介紹了IntelliJ IDEA配置Maven阿里云鏡像加速源的全流程,需要的朋友可以參考下
    2025-09-09
  • JAVA中ArrayList與順序表舉例詳解

    JAVA中ArrayList與順序表舉例詳解

    ArrayList是Java集合框架中實(shí)現(xiàn)List接口的動(dòng)態(tài)數(shù)組,位于java.util包中,繼承AbstractList并實(shí)現(xiàn)泛型數(shù)據(jù)結(jié)構(gòu),這篇文章主要介紹了JAVA中ArrayList與順序表的相關(guān)資料,需要的朋友可以參考下
    2025-10-10
  • spring-data-redis 動(dòng)態(tài)切換數(shù)據(jù)源的方法

    spring-data-redis 動(dòng)態(tài)切換數(shù)據(jù)源的方法

    最近遇到了一個(gè)麻煩的需求,我們需要一個(gè)微服務(wù)應(yīng)用同時(shí)訪問兩個(gè)不同的 Redis 集群,一般情況下我們會(huì)怎么處理呢,下面通過場(chǎng)景分析給大家介紹spring-data-redis 動(dòng)態(tài)切換數(shù)據(jù)源的方法,感興趣的朋友一起看看吧
    2021-08-08
  • Java根據(jù)前端傳回的圖片生成pdf并且加密碼和水印

    Java根據(jù)前端傳回的圖片生成pdf并且加密碼和水印

    這篇文章主要為大家詳細(xì)介紹了java如何根據(jù)前端傳回的png圖片數(shù)組,后端加水印加密碼生成pdf并返回給前端,感興趣的小伙伴可以參考一下
    2025-01-01

最新評(píng)論

卓资县| 于田县| 平遥县| 泰兴市| 蚌埠市| 宜春市| 舟曲县| 武威市| 清徐县| 泽州县| 东平县| 汽车| 潮安县| 乌拉特中旗| 翁源县| 莱阳市| 大方县| 越西县| 凉城县| 崇信县| 平潭县| 米泉市| 昌乐县| 山阴县| 宁阳县| 隆化县| 定安县| 策勒县| 泸水县| 临邑县| 安宁市| 小金县| 赤峰市| 满洲里市| 新津县| 太和县| 金乡县| 尚志市| 泸西县| 乌鲁木齐县| 河池市|