Java信号量Semaphore的使用

news/2024/7/8 4:28:05 标签: semaphore, Java信号量
Semaphore是用来保护一个或者多个共享资源的访问,Semaphore部维护了一个计数器,其值为可以访问的共享资源的个数。
一个线程要访问共享资源,先获得信号量,如果信号量的计数器值大于1,意味着有共享资源可以访问,则使其计数器值减去1,再访问共享资源。如果计数器值为0,线程进入休眠。当某个线程使用完共享资源后,释放信号量,并将信号量内部的计数器加1,之前进入休眠的线程将被唤醒并再次试图获得信号量。

一种实际的情况,大家去水房打水,只有两个水龙头,来了20个人,需要排队。

ExecutorService service = Executors.newCachedThreadPool();

Semaphore waters = new Semaphore(2); //两个水龙头
for (int i = 0; i < 20; i++) {
    service.submit(new UseWater("张三" + i, waters)); //新来的打水者
}

service.shutdown(); //所有任务执行完后关闭。

waters.acquireUninterruptibly(2);//如果水龙头前有人排队则等待线程完成。
//打水逻辑

if(number.availablePermits() > 0) {
    System.out.println(name + "正在打水");
} else {
    System.out.println(String.format("没有位置,%s-排队..", name));
}

try {
    number.acquire();//获取水龙头
    
    System.out.println(name + "开始打水..");
    Thread.sleep(((int) (100 * Math.random())));
    System.out.println(name + "打完水离开..");

    number.release();//释放水龙头

} catch (InterruptedException e) {
    e.printStackTrace();
}


http://www.niftyadmin.cn/n/1218113.html

相关文章

计算机组成与结构知识

第1章 计算机系统概述 1.1 计算机的硬件和软件 1.2 计算机系统的层次结构和性能指标 1.3 计算机的发展和应用转载于:https://www.cnblogs.com/rcy2012/p/6004359.html

Java多线程以及进程间的通信方式

Java 线程通信&#xff1a; &#xff11;共享变量&#xff0c;如volatite等 &#xff12;wait/notify机制&#xff0c;最好搭配同步锁 &#xff13;Lock/Condition机制  //condition.await()&#xff1b;condition.signalAll(); &#xff14;管道 //PipedOutputStream out; P…

阿里云高可用-容灾解决方案

这两天&#xff0c;一篇名为《IT之家因无法忍受阿里云而迁移至XX云》的文章引起了整个云计算行业的热议。&#xff08;袋鼠云CTO江枫还专门写了一篇热评&#xff1a;点击阅读原文。&#xff09; 从目前得到的信息看&#xff0c;其应该是在青岛区域购买了一台云服务器ECS&#x…

Ubuntu安装chrome浏览器

&#xff11;&#xff0e;执行命令将下载源加入到系统的源列表 sudo wget http://www.linuxidc.com/files/repo/google-chrome.list -P /etc/apt/sources.list.d &#xff12;&#xff0e;执行命令导入谷歌软件的公钥&#xff0c;对下载软件进行验证。如果顺利的话&#xff0c;…

Java基础: 什么是指令重排序/as-if-serial/内存屏障/happens-before

Java基础知识 指令重排序 在执行程序时&#xff0c;为了提高性能&#xff0c;编译器和处理器会对指令做重排序。编译器优化重排序&#xff1a;编译器在不改变单线程程序语义的前提下&#xff0c;可以重新安排语句的执行顺序。指令级并行的重排序&#xff1a;如果不存l在数据依赖…

php实例源码之获取mysql表中所有行和列

本文章向大家介绍php获取mysql表中所有行和列的源码&#xff0c;主要使用到mysql_num_rows和mysql_fetch_row等php的数据库操作函数&#xff0c;该实例有助于大家熟悉PHP mysql数据库编程的相关知识&#xff0c;需要的朋友可以参考一下。php获取mysql表中所有行和列的源代码如下…

TSP问题

之前写过一道类似的题目&#xff0c;Uva 1347. http://www.cnblogs.com/TreeDream/p/5981535.html 这个题目和TSP问题已经很接近了&#xff0c;只是描述的奇奇怪怪的&#xff0c;从最左边走到最右边。其实和TSP问题&#xff0c;没有区别了。 介绍一下常规的TSP解法&#xff1a;…

Java中栈和堆

Java在内存中分为&#xff15;个空间&#xff0c;1.寄存器&#xff0c;&#xff12;.本地方法区&#xff0c;3.方法区&#xff0c;4.栈&#xff0c;5.堆 基础点&#xff1a; 1. 基本数据类型、局部变量都是存放在栈内存中的&#xff0c;用完就消失。 2. new创建的实例化对象及数…