【JAVA并发】Semaphore:信号量的使用

2023-05-16

一、什么是 Semaphore

Semaphore 也叫信号量,在 JDK1.5 被引入,主要用于在多个线程访问多个共享资源的场景下,通过协调各个线程,来保证合理的资源访问。 例如数量有限的餐厅桌椅,银行业务办理窗口等。

二、Semaphore 常用 APi

方法说明
acquire()从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被 中断
acquire(int permits)从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞,或者线程已被中断
release()释放一个许可,将可用的许可数增加 1
release(int permits)释放给定数目的许可,将其返回到信号量
isFair()如果此信号量的公平设置为 true,则返回 true

三、代码示例

例如:工厂只有 5 台机器,每台机器限一人使用,现对 8 名工人进行资源分配:

public class SemaphoreTest {

    public static void main(String[] args) {

        // 线程池
        ExecutorService exec = Executors.newCachedThreadPool();
        // 只有5台机器
        final Semaphore semp = new Semaphore(5);
        // 模拟8 个工人工作
        for (int i = 0; i < 8; i++) {
            final int emp_num = i;
            Runnable run = new Runnable() {
                public void run() {
                    try {
                        // 获取许可
                        semp.acquire();
                        System.out.println("获得许可,当前工作工人: " + emp_num);
                        Thread.sleep((long) (Math.random() * 10000));

                        // 访问完后,释放
                        semp.release();
                        System.out.println("释放资源,当前空闲机器数量:" + semp.availablePermits());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            exec.execute(run);
        }
        // 退出线程池
        exec.shutdown();
    }
}

结果打印:

获得许可,当前工作工人: 4
获得许可,当前工作工人: 3
获得许可,当前工作工人: 1
获得许可,当前工作工人: 2
获得许可,当前工作工人: 0
释放资源,当前空闲机器数量:1
获得许可,当前工作工人: 5
释放资源,当前空闲机器数量:1
获得许可,当前工作工人: 7
释放资源,当前空闲机器数量:1
获得许可,当前工作工人: 6
释放资源,当前空闲机器数量:1
释放资源,当前空闲机器数量:2
释放资源,当前空闲机器数量:3
释放资源,当前空闲机器数量:4
释放资源,当前空闲机器数量:5

另外:在创建Semaphore对象的时候还可以指定它的公平性。一般常用非公平的信号量,非公平信号量是指在获取许可时先尝试获取许可,而不必关心是否已有需要获取许可的线程位于等待队列中,如果获取失败,才会入列。而公平的信号量在获取许可时首先要查看等待队列中是否已有线程,如果有则入列。

公平信号量的创建方式:  Semaphore semaphore = new Semaphore(5,true);

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【JAVA并发】Semaphore:信号量的使用 的相关文章

  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • 通过 InjectMocks Spy 注入对象

    我需要对一个类运行一系列单元测试 该类具有 Autowired Logger 实现 实现的基本思想是 Mock Logger logger InjectMocks TestedClass tested 但我想保存日志输出功能 Mockito
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • PropertySources 中各种源的优先级

    Spring引入了新的注释 PropertySources对于所有标记为的类 Configuration since 4 0 需要不同的 PropertySource作为论证 PropertySources PropertySource c
  • Spring Stomp over Websocket:流式传输大文件

    我的SockJs客户端在网页中 发送帧大小为16K的消息 消息大小限制决定了我可以传输的文件的最大大小 以下是我在文档中找到的内容 Configure the maximum size for an incoming sub protoco
  • 想要开发像 Facebook 这样的网站 - 处理数百万个请求 - 高性能 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想用 Java 开发一个像 Fac
  • 尝试在没有 GatewayIntent 的情况下访问消息内容

    我希望每当我写一条打招呼的消息时 机器人都会在控制台中响应一条消息 但它只是给我一个错误 JDA MainWS ReadThread WARN JDA Attempting to access message content without
  • 如何在java中使jpeg无损?

    有没有人可以告诉我如何使用编写 jpeg 文件losslessjava中的压缩 我使用下面的代码读取字节来编辑字节 WritableRaster raster image getRaster DataBufferByte buffer Da
  • 打印包含 JBIG2 图像的 PDF

    请推荐一些库 帮助我打印包含 JBIG2 编码图像的 PDF 文件 PDFRenderer PDFBox别帮我 这些库可以打印简单的 PDF 但不能打印包含 JBIG2 图像的 PDF PDFRenderer尝试修复它 根据 PDFRedn
  • 从 Java 日历迁移到 Joda 日期时间

    以前 当我第一次设计股票应用相关软件时 我决定使用java util Date表示股票的日期 时间信息 后来我体会到了大部分方法java util Date已弃用 因此 很快 我重构了所有代码以利用java util Calendar 然而
  • 如何使用 Mockito 和 Junit 模拟 ZonedDateTime

    我需要模拟一个ZonedDateTime ofInstant 方法 我知道SO中有很多建议 但对于我的具体问题 到目前为止我还没有找到任何简单的解决办法 这是我的代码 public ZonedDateTime myMethodToTest
  • 不兼容的类型:在 java netbeans 中对象无法转换为 String

    我试图在我的项目中使用对象数组 但出现错误 incompatible types Object cannot be converted to String 在这一行 ST1 new String emt1 emt2 emt3 emt4 现在
  • 将 RSA 密钥从 BigIntegers 转换为SubjectPublicKeyInfo 形式

    WARNING 最初的问题是关于 PKCS 1 编码密钥 而问题中的实际示例需要SubjectPublicKeyInfo X 509 编码密钥 我目前正致力于在 java 中从头开始实现 RSA 算法 特别是密钥生成方面 现在我的代码可以给
  • ExceptionHandler 不适用于 Throwable

    我们的应用程序是基于 Spring MVC 的 REST 应用程序 我正在尝试使用 ExceptionHandler 注释来处理所有错误和异常 I have ExceptionHandler Throwable class public R
  • 使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

    我在 S3 上有很多文件 需要对其进行压缩 然后通过 S3 提供压缩文件 目前 我将它们从流压缩到本地文件 然后再次上传该文件 这会占用大量磁盘空间 因为每个文件大约有 3 10MB 而且我必须压缩多达 100 000 个文件 所以一个 z
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http
  • 从java中的字符串数组中删除空值

    java中如何从字符串数组中删除空值 String firstArray test1 test2 test4 我需要像这样没有 null 空 值的 firstArray String firstArray test1 test2 test4
  • 如何移动图像(动画)?

    我正在尝试在 x 轴上移动船 还没有键盘 我如何将运动 动画与boat png而不是任何其他图像 public class Mama extends Applet implements Runnable int width height i
  • struts 教程或示例

    我正在尝试在 Struts 中制作一个登录页面 这个想法是验证用户是否存在等 然后如果有错误 则返回到登录页面 错误显示为红色 典型的登录或任何表单页面验证 我想知道是否有人知道 Struts 中的错误管理教程 我正在专门寻找有关的教程 或
  • 为什么 BufferedWriter 不写入文件?

    我有这个代码 String strings Hi You He They Tetrabenzene Caaorine Calorine File file new File G words txt FileWriter fWriter Bu

随机推荐

  • 【UNIX环境高级编程】UNIX基础知识

    UNIX环境高级编程 UNIX基础知识 1 UNIX体系结构 从严格意义上 xff0c 可将操作系统定义为一种软件 xff0c 它控制计算机硬件资源 xff0c 提供程序运行环境 xff0c 我们称这种软件为内核 内核的接口称为系统调用 公
  • kubernetes单个pod运行两个容器yaml文件实践

    kubernetes单个pod运行两个容器yaml文件实践 1 rc的yaml文件 apiVersion v1 kind Replicationtroller metadate name baolei rc spec replicas 1
  • 两个python切换

    安装好后 xff0c 使用activate激活某个环境 activate python34 for Windows source activate python34 for Linux amp Mac 激活后 xff0c 会发现termin
  • nvidia jetson nano 操作指南

    硬件购买以及注意点 购买硬件之后在网卡后面有个短路帽要加上 xff0c 否则无法开机 系统安装 nvidia jetson nano系统安装在SD卡中 xff0c 请预先准备一个32G的SD卡 系统安装步骤请参考官网 Getting Sta
  • mysql 保留两位小数(四舍五入)

    1 round 保留两位小数 xff0c 缺点是java接受数据的时候要使用double类型 xff0c 而且对于没有两位小数的数 xff0c 会保留两位小数本身 xff01 2 format xff08 xff09 不够两位的补两位 xf
  • 解决axios的post传参服务器无法接收的问题

    问题描述 xff1a 我在使用axios的post方法进行传参时 xff0c 后端无法接收到传递参数 xff0c 查看浏览器发现 xff0c 其传递方式竟然是 request payload xff0c 而不是from data 解决方法
  • tcp11种状态

    https www cnblogs com yinbiao p 11015018 html
  • The authenticity of host 192.168.0.xxx can‘t be established. 的问题

    ssh登录 The authenticity of host 192 168 0 xxx can t be established 的问题 scp免密码登录 xff1a Linux基础 scp免密码登陆进行远程文件同步 执行scp一直是OK
  • yum安装scp

    yum安装scp yum install openssh clients y
  • mysql枚举类型

    1 使用枚举类型的好处 对数据进限定 xff0c 增加其安全性查询速度更快操作更加方便 2 枚举类型的应用 创建 test 数据库 create database span class token function test span ch
  • django将model示例转化为dict

    1 示例说明 以下示例是在 django shell 完成的 xff0c User 表为 django内建表 2 示例演示 2 1 进入 django shell python manage py shell 2 2 进入后 shell显示
  • 解决sftp无法上传文件的问题

    上传单个文件报错 sftp span class token operator gt span put hahaha Uploading hahaha to hahaha remote open span class token punct
  • 宝塔面板报错

    换用浏览器即可
  • 解决linux的centos版本修改时间重启后无效的问题

    转 解决linux的centos版本修改时间重启后无效的问题 centos7系统时间与硬件时间同步
  • vim编辑器删除所有内容

    命令行下输入 d
  • (思科、锐捷、华为)交换机配置snmp(学习笔记)

    SNMP 的作用 xff1a xff08 1 xff09 可以以图标的方式显示思科路由器 交换机的带宽使用情况 xff0c 可以按端口 数据流向等分类 xff08 2 xff09 以图形方式显示网络错误 比如crc错误 xff08 3 xf
  • GitHub分支(branch)合并

    转载自 xff1a http blog csdn net loadsong article details 51591536 侵删 本地两个分支合并 先从最简单的一种情况着手 现在项目只有一个 master 分支 xff0c 我来新建一个
  • YOLO选择出只有某一类的检测框并将框保存在txt中

    YOLO是用来检测的 小肚就是来将物体检测出 xff0c 并用物体进行识别 xff0c 所以YOLO只是一个预处理过程 安装和命令行运行检测在官网上都有 xff0c 但是唯一的就是 xff0c 我想要的只有person这一类 xff0c 并
  • linux防火墙ifirewalld详解

    文章目录 firewalld 介绍firewall的基本概念firewall cmd 配置防火墙富规则配置直接规则配置 firewalld 介绍 在CentOS 7里有几种防火墙共存 xff1a firewalld iptables ebt
  • 【JAVA并发】Semaphore:信号量的使用

    一 什么是 Semaphore Semaphore 也叫信号量 xff0c 在 JDK1 5 被引入 xff0c 主要用于在多个线程访问多个共享资源的场景下 xff0c 通过协调各个线程 xff0c 来保证合理的资源访问 例如数量有限的餐厅