Java 信号量机制实现

news/2025/11/14 15:04:58/文章来源:https://www.cnblogs.com/Jing61/p/19222134

Java 信号量机制实现

信号量 Semaphore

信号量可限制访问共享资源的线程数。线程访问资源前需从信号量获取许可,访问结束后需将许可归还信号量。
image

场景介绍

一个停车场只有5个车位,现有100辆车争抢这5个车位。理想情况下,最多同时有5辆车能抢到车位,未抢到车位的车需等待,直到其他车让出车位后才有机会使用。

实现代码

package com.semaphore;import java.util.concurrent.*;/*** @author Jing61*/
public class CarPark {public static void main(String[] args) {//阻塞队列BlockingQueue<String> parks = new LinkedBlockingQueue<>(5);parks.offer("车位一");parks.offer("车位二");parks.offer("车位三");parks.offer("车位四");parks.offer("车位五");ExecutorService executorService = Executors.newCachedThreadPool();// 5个车位(许可)Semaphore semaphore = new Semaphore(5);for (int i = 0; i < 100; i++) {final int no = i;Thread t1 = new Thread(() -> {try {/*** 获取许可,首先判断semaphore内部的数字是否大于0,如果大于0,* 才能获得许可,然后将初始值5减去1,线程才会接着去执行;如果没有* 获得许可(原因是因为已经有5个线程获得到许可,semaphore内部的数字为0),* 线程会阻塞直到已经获得到许可的线程,调用release()方法,释放掉许可,* 也就是将semaphore内部的数字加1,该线程才有可能获得许可。*/semaphore.acquire();/***  对应的线程会到阻塞对,对应车辆去获取到车位,如果没有拿到一致阻塞,*  直到其他车辆归还车位。*/String park = parks.take();  System.out.println("车辆【" + no + "】获取到: " + park);Thread.sleep((long) Math.random() * 6000);System.out.println("车辆【" + no + "】离开 " + park);semaphore.release(); //线程释放掉许可,通俗来将就是将semaphore内部的数字加1parks.offer(park);  //归还车位} catch (InterruptedException e) {e.printStackTrace();}});executorService.execute(t1);}executorService.shutdown();}
}

哲学家进餐问题

1965年,荷兰计算机科学家、图灵奖得主Edsger Wybe Dijkstra提出并解决了“哲学家进餐”同步问题。

问题描述

五个哲学家围坐在圆桌旁,每人面前有一盘通心粉。由于通心粉较滑,需两把叉子才能夹住。相邻两个盘子之间放有一把叉子(如下图所示)。

image

哲学家的生活有两种交替活动:吃饭和思考。当哲学家感到饥饿时,会尝试分两次取左右两边的叉子(每次拿一把,不分次序)。成功拿到两把叉子后开始吃饭,吃完后放下叉子继续思考。

若将哲学家替换为线程,叉子替换为竞争的临界资源,该问题即为线程竞争资源问题。若设计不当,系统可能出现死锁、活锁、吞吐量下降等问题。

信号量原语解决方案(Java 实现)

以下是使用 Java 5 并发工具包中的 Semaphore 类解决哲学家进餐问题的代码:

package com.wise.tiger;import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;/*** 存放线程共享信号量上下文* @author Jing61*/
public class SemaphoreContext {public static final int NUM_OF_FORKS = 5;//叉子数量(资源)public static final int NUM_OF_PHILO = 5;//哲学家数量(线程)public static Semaphore[] forks;public static Semaphore counter;static{forks = new Semaphore[NUM_OF_FORKS];for(int i = 0 ; i < forks.length; i++){forks[i] = new Semaphore(1);}counter = new Semaphore(NUM_OF_PHILO - 1);}public static void putFork(int index,boolean leftFirst) throws Exception{if(leftFirst) {forks[index].acquire();forks[(index + 1) % NUM_OF_PHILO].acquire();}else {forks[(index + 1) % NUM_OF_PHILO].acquire();forks[index].acquire();}}public static void takeFork(int index,boolean leftFirst) throws Exception{if(leftFirst) {forks[index].release();forks[(index + 1) % NUM_OF_PHILO].release();}else {forks[(index + 1) % NUM_OF_PHILO].release();forks[index].release();}}static class Philo implements Runnable{private int index;private String name;public Philo(int index, String name) {this.index = index;this.name = name;}@Overridepublic void run() {while (true) {try {counter.acquire();boolean isLeftFirst = index % 2 == 0;putFork(index, isLeftFirst);System.out.println(name + "正在吃通心粉。。。。。");takeFork(index, isLeftFirst);System.out.println(name + "吃完了,正在思考");counter.release();} catch (Exception e) {e.printStackTrace();}}}}public static void main(String[] args) {Philo[] philos = {new Philo(0,"peppa"),new Philo(1,"pedro"),new Philo(2,"emily"),new Philo(3,"suzy"),new Philo(4,"danny"),};var pool = Executors.newCachedThreadPool();for(int i= 0; i < philos.length;i++){pool.execute(philos[i]);}pool.shutdown();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/965418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

习题解析之:字母查找

习题解析之:字母查找【问题描述】 定义一个函数来判断单词m是否可以由字符串n中出现的字母来组成。本题保证字符串中出现的字母均为小写字母,且不考虑n中的字母使用次数。在两行中分别输入两个字符串m,n如果输入的m包…

lc:338练习的一点思考

public int[] CountBits(int n) { int[] res = new int[n + 1]; for (int i = 0; i <= n; i++) { res[i] = CountOnesWithBitOperation(i); } return res; } …

京东商品评论接口深度逆向:从加密参数破解到情感倾向分析

京东商品评论接口因涉及用户行为数据,其反爬机制比商品详情、搜索接口更为严格,不仅采用多层参数加密,还引入了基于用户行为轨迹的动态验证。本文将突破传统的单一接口模拟思路,通过逆向评论加载的完整链路,实现评…

JSC2023 Max Degree Sum

并查集+贪心维护边权超小的动态 MST显然有一个暴力是按 \([u_i\leq k]+[v_i\leq k]\) 为边权跑最大生成树,但是看起来不是很好维护的样子。 发现我们只需要考虑当前边权为 \(1\) 或 \(2\) 的边。于是最多我们只需要考…

还在求Sora2邀请码?我已经用Sora2 API批量生成无水印视频了!(附免费去水印+Api调用教程)

还记得Sora 2刚发布时,它生成的视频带给你的那种冲击感吗? “这真的是AI生成的?”“太逼真了吧!”“我还以为是真的!” sora2这次带来的画面,已经逼真到肉眼难以分辨真假。有些视频一旦去掉水印,很多人根本看不…

[LangChian] 18. 自动维护聊天记录

上一节我们体验了“手动维护聊天记录”,每次都要:把用户发言添加到 history 把模型输出添加到 history 每轮都手动调用 getMessages() 构造上下文await history.addMessage(new HumanMessage(input)); await history…

2025年燃生物质有机热载体锅炉生产厂家权威推荐榜单:燃生物质热水锅炉/生物质专用锅炉/生物质热水锅炉源头厂家精选

在“双碳”目标持续推进的背景下,燃生物质有机热载体锅炉凭借其清洁、可再生、低碳排放的特性,正成为工业供热领域的重要选择。 根据行业报告数据,2025年生物质能在中国可再生能源消费中的占比预计将稳步提升,其中…

二进制掩码规律

& 0x1 = & 0b1 → 保留 1 位 (范围: 0-1) & 0x3 = & 0b11 → 保留 2 位 (范围: 0-3) & 0x7 = & 0b111 → 保留 3 位 (范围: 0-7) & 0xF = & 0b1111 …

jenkins构建生成docker镜像

pipeline {agent anyenvironment {CODE_DIR = "/jenkins_data/springboot_test"DATE = new Date().format(YYYYMMddHHmmss)TAG = "${DATE}"IMAGE_NAME = springtestIMAGE_NAME_ALIYUN = "reg…

2025年复合风管板权威推荐榜单:铝箔复合风管/酚醛复合风管/彩钢酚醛复合风管源头厂家精选

复合风管板作为现代建筑通风系统中不可或缺的核心材料,其市场需求正随着绿色建筑标准的提升和建筑节能要求的加强而持续增长。本文将基于详实的行业数据,为您推荐2025年度在复合风管板领域表现卓越的Top 3制造厂,通…

在线文档大全

go文档 go高级编程 go中文文档 go框架gin go-zero 开源项目地址 https://github.com/Mikaelemmmm/go-zero-looklook goframeweb3.0

AI大事记12:Transformer 架构——重塑 NLP 的革命性技能(下)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

记一次多线程插入或者更新数据库表操作优化过程

背景:有个数百万的数据,需要尽快入库,使用了多线程处理,先查询数据库是否存在,存在则更新;否则插入; 问题:数据库相同key的数据,有时候插入多条。 解决办法:String lockKey =getLockKey(t); //根据md5算法,…

2025年进口干冰机代理工厂权威推荐榜单:干冰清洗机/干冰制造机源头厂家精选

工业干冰机作为现代清洁与表面处理领域的重要设备,其市场需求正随着制造业升级和环保要求的提升而持续增长。本文将基于详实的行业视角,为您推荐2025年度在进口干冰机代理领域表现卓越的Top 3服务商,通过客观分析和…

接口调试利器,Postman免安装,免登陆 - 详解

接口调试利器,Postman免安装,免登陆 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…

微算法科技(NASDAQ MLGO)在委托权益证明DPoS主链上引入PoW轻节点验证,提升抗量子攻击能力

随着量子计算技术的飞速发展,传统区块链的加密算法面临着前所未有的威胁。量子计算机强大的计算能力有可能在短时间内破解现有的加密机制,导致区块链的安全性遭受重创。委托权益证明(DPoS)作为一种高效的共识机制,…

字的bi-gram可能是个馊主意

续之前的贴子,我们有了部精修词典,二至六字词共169872个。 foreach 词,用字的2-gram去检查首选是否正确,结果很差,可在〔这里〕下载 123094个不一样的。部分结果:䴔䴖 交警 𫘝𫘨 抉剔 吖嗪 阿嗪 腌菜 言采 腌…

常见的几种硬盘接口类型

常见的几种硬盘接口类型IDE 接口:40 个针脚,通过 PATA 协议控制数据传输理论最大传输速率 133MB/s,实际更低,已经被淘汰了。SATA 接口:22 个针脚,15 针用于供电,7 针用于数据传输。通过AHCI 协议控制数据传输,…

2025年w70钨铜棒制造企业权威推荐榜单:钨铜导电块/钨铜块/93钨合金源头厂家精选

在高端制造业快速发展的背景下,W70钨铜棒作为关键功能材料,其市场需求持续增长。根据QYResearch最新报告显示,全球钨铜合金市场规模预计将在2025年达到新高度,年复合增长率保持在5.8% 的稳定水平。 W70钨铜棒凭借其…

嵌入式系统profinet转devicenet固件与硬件接口的连接案例

本案例适用于智能仓储物流系统,西门子S7-1200PLC通过Profinet连接DeviceNet主站网关,网关下联DeviceNet从站型AGV(自动导引车)驱动模块和扫码枪,实现AGV的路径控制与货物信息采集。核心需求是基于网关的嵌入式固件…