多线程中的Semaphore信号量

2023-09-18 10:37:47

在Java多线程编程中,Semaphore是一种用于控制资源访问的机制。Semaphore允许您限制同时访问某个资源的线程数量。这在需要限制并发访问的情况下非常有用,例如数据库连接池或有限数量的线程池。

创建Semaphore

要使用Semaphore,首先需要创建一个Semaphore对象并指定许可证数量。许可证数量表示可以同时访问资源的线程数量。

import java.util.concurrent.Semaphore;

public class SemaphoreExample {
    public static void main(String[] args) {
        int permits = 3; // 允许同时访问的线程数量
        Semaphore semaphore = new Semaphore(permits);
    }
}

获取许可证

要访问受Semaphore控制的资源,线程需要获取许可证。如果没有可用的许可证,线程将被阻塞,直到有可用的许可证为止。

try {
    semaphore.acquire(); // 获取一个许可证
    // 访问受Semaphore控制的资源
} catch (InterruptedException e) {
    // 处理中断异常
} finally {
    semaphore.release(); // 释放许可证
}

释放许可证

一旦线程完成对资源的访问,应该释放许可证以便其他线程可以访问它。

实战

以下是一个简单的示例,演示了如何使用Semaphore来控制并发访问资源:

如上,一次只能由一个线程对该放入进行写入操作。其他线程阻塞等待。当然synchronized也能实现这一功能,但是Semaphore相对更加灵活。

更多推荐

使用springcloud-seata解决分布式事务问题-2PC模式

目录一、建立undo_log表二、安装事务协调器:seata-server三、整合可以查看官网:快速启动|Seata一、建立undo_log表--注意此处0.3.0+增加唯一索引ux_undo_logCREATETABLE`undo_log`(`id`bigint(20)NOTNULLAUTO_INCREMENT,`b

华为OD机试 - 滑动窗口最大和 - 滑动窗口(Java 2023 B卷 100分)

目录专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明华为OD机试2023B卷题库疯狂收录中,刷题点这里专栏导读本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题

【技术分享】NetLogon于域内提权漏洞(CVE-2020-1472)

一、漏洞介绍CVE-2020-1472是一个Windows域控中严重的远程权限提升漏洞。攻击者在通过NetLogon(MS-NRPC)协议与AD域控建立安全通道时,可利用该漏洞将AD域控的计算机账号密码置为空,从而控制域控服务器。该漏洞适用于Win2008及后的所有版本。二、漏洞原理Netlogon使用的AES认证算法

区块链(3):区块链去中心化

1点对点同步区块链的流程流程图如下:流程讲解:(1)连接节点(2)向该节点请求最新区块(3)请求到区块以后,根据返回的最新区块前置hash是否和我本身的区块hash相等,分为两种情况:第一种情况:最新区块前置hash和我本身的区块hash相等并合法有效,则最新区块是新区块,同时添加到我的链中。然后广播到我这个节点连接的

期权交易保证金比例一般是多少?

期权交易是一种非常受欢迎的投资方式之一,它为期权市场带来了更为多样化和灵活化的交易形式。而其中的期权卖方保证金比例是期权交易中的一个重要指标,直接关系到投资者的风险与收益,下文介绍期权交易保证金比例一般是多少?本文来自:期权酱一、期权的交易保证金如何计算?期权交易保证金分为开仓保证金和维持保证金。采用非线性保证金的方式

Spring Authorization Server入门 (十七) Vue项目使用授权码模式对接认证服务

Vue单页面项目使用授权码模式对接流程说明以下流程摘抄自官网在本例中为授权代码流程。授权码流程的步骤如下:客户端通过重定向到授权端点来发起OAuth2请求。如果用户未通过身份验证,授权服务器将重定向到登录页面。身份验证后,用户将再次重定向回授权端点。如果用户未同意所请求的范围并且需要同意,则会显示同意页面。一旦用户同意

Spring中@Component和@Bean的区别

前言Spring是一个流行的Java开发框架,它提供了一种简化应用程序开发的方式。在Spring中,@Component和@Bean是两个常用的注解,用于定义和管理对象的创建和依赖注入。虽然它们都用于创建和管理对象,但有一些关键区别。@Component注解@Component是Spring框架的核心注解之一,它用于标

DevOps:从历史到实践的全面解析

在当今的软件开发领域,DevOps已经成为了一个耳熟能详的词汇。从历史发展的角度来看,DevOps源自敏捷开发和云计算的兴起,是软件开发和运维的必然趋势。本文将详细介绍DevOps的历史发展、相关技术以及实践案例,最后对DevOps的意义和未来发展趋势进行总结。一、DevOps的历史发展DevOps作为一项运动,起源于

Json-Jackson和FastJson

狂神:测试Jackson纯Java解决日期格式化设置ObjectMapperFastJson:知乎:Jackson使用指南1、常见配置方式一:yml配置spring.jackson.date-format指定日期格式,比如yyyy-MM-ddHH:mm:ss,或者具体的格式化类的全限定名spring.jackson.t

从「思想实验」中学习,自监督 AI 模型向科学家看齐

年初ChatGPT爆火,美国《时代周刊》发文揭露其背后的「血汗工厂」,给「AIGC领头羊」耀眼的光环蒙上了一层巨大阴影。据报道,为训练ChatGPT识别有害内容,一群来自肯尼亚、乌干达和印度的外包员工负责给数据库手动标注,他们每天花费9小时鉴别各种攻击性词汇,每小时至多标注2万个单词,收获是1.32-2美元的时薪以及持

基于LiDAR的对象检测中的课程化对象操作

论文标题:CurricularObjectManipulationinLiDAR-basedObjectDetection代码:https://github.com/ZZY816/COM导读本文探讨了LiDAR传感器在自动驾驶等安全关键应用中的3D物体检测任务,并引入了一种创新的训练框架,被称为"curricularo

热文推荐