java信号量_JAVA多线程--信号量(Semaphore)

2023-05-16

简介

信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。

一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。拿到信号量的线程可以进入代码,否则就等待。通过acquire()和release()获取和释放访问许可。

概念         Semaphore分为单值和多值两种,前者只能被一个线程获得,后者可以被若干个线程获得。

以一个停车场运作为例。为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开两辆,则又可以放入两辆,如此往复。

在这个停车场系统中,车位是公共资源,每辆车好比一个线程,看门人起的就是信号量的作用。

更进一步,信号量的特性如下:信号量是一个非负整数(车位数),所有通过它的线程(车辆)都会将该整数减一(通过它当然是为了使用资源),当该整数值为零时,所有试图通过它的线程都将处于等待状态。在信号量上我们定义两种操作: Wait(等待) 和 Release(释放)。 当一个线程调用Wait(等待)操作时,它要么通过然后将信号量减一,要么一直等下去,直到信号量大于一或超时。Release(释放)实际上是在信号量上执行加操作,对应于车辆离开停车场,该操作之所以叫做“释放”是因为加操作实际上是释放了由信号量守护的资源。

在java中,还可以设置该信号量是否采用公平模式,如果以公平方式执行,则线程将会按到达的顺序(FIFO)执行,如果是非公平,则可以后请求的有可能排在队列的头部。

JDK中定义如下:

Semaphore(int permits, boolean fair)

创建具有给定的许可数和给定的公平设置的Semaphore。

Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java并发库Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。

Semaphore实现的功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中 的任何一个人让开后,其中等待的另外5个人中又有一个人可以占用了。另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,这取决于构造Semaphore对象时传入的参数选项。单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。

代码示例

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Semaphore;

/**

* DateTime: 2015年1月1日 下午6:41:01

*

*/

public class SemaPhore {

public static void main(String[] args) {

// 线程池

ExecutorService exec = Executors.newCachedThreadPool();

// 只能5个线程同时访问

final Semaphore semp = new Semaphore(5);

// 模拟20个客户端访问

for (int index = 0; index < 50; index++) {

final int NO = index;

Runnable run = new Runnable() {

public void run() {

try {

// 获取许可

semp.acquire();

System.out.println("Accessing: " + NO);

Thread.sleep((long) (Math.random() * 6000));

// 访问完后,释放

semp.release();

//availablePermits()指的是当前信号灯库中有多少个可以被使用

System.out.println("-----------------" + semp.availablePermits());

} catch (InterruptedException e) {

e.printStackTrace();

}

}

};

exec.execute(run);

}

// 退出线程池

exec.shutdown();

}

}

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

java信号量_JAVA多线程--信号量(Semaphore) 的相关文章

  • Linux服务配置 配置VNC远程桌面

    一 VNC简介 VNC Virtual Network Console 是虚拟网络控制台的缩写 它 是一款优秀的远程控制工具软件 xff0c 由著名的 AT amp T 的欧洲研究实验室开发的 VNC 是在基于 UNIX 和 Linux 操
  • 异常检测 and 自编码器(2)

    文章目录 前言一 自编码器用于异常检测的网址推荐1 自编码器AutoEncoder解决异常检测问题2 基于自编码器的时间序列异常检测算法3 深度学习实现自编码器Autoencoder神经网络异常检测心电图ECG时间序列 总结 前言 上篇文章
  • python树莓派3控制蜂鸣器_树莓派3 modelB型 连接HC-SR501人体红外感应模块和蜂鸣器模块...

    连接前准备 树莓派3 modelB型一个 HC SR501传感器一只 低电平蜂鸣器模块 有源 即接上电就会响 xff0c 低电平触发 母对母杜邦线三根 实物图如下 xff1a 博主连接的不是特别美观 两个传感器的连接图分别如下 HC SR5
  • git submodule 使用教程

    1 submoude 介绍 xff08 1 xff09 项目很大参与开发人员多的时候 xff0c 需要将各个模块文件进行抽离单独管理 xff08 2 xff09 使用git submodule来对项目文件做成模块抽离 xff0c 抽离出来的
  • 为什么笔记本电脑电源适配器基本是19V供电

    为什笔记本电源适配器供电一般不是20V xff0c 不是25V xff0c 偏偏是19V呢 xff0c 我们从硬件角度聊聊这个问题 首先一个大背景是 xff0c 笔记本电池基本都是锂电池为主 xff0c 在设计上 xff0c 一般会使用多枚
  • 基于国产飞腾、Intel X86等CPU主板设计与调试入门指导

    知识就像货币 xff0c 流动才有意义 一 前言 因为我是做硬件的 xff0c 想用这样一篇文章介绍一下我们常见的电脑主板 xff0c 或者说电路板卡 xff0c 是怎么设计出来的 仅以技术之所学 xff0c 得此文章 xff0c 若有表达
  • 两台电脑直接使用一根网线传输文件

    教程 目录 xff1a https blog csdn net dkbnull article details 87933584 有时候我们需要在两台电脑之间传输几十G的大文件 xff0c 或者置换新电脑时复制文件到新电脑 xff0c 而我
  • keil5(ARM)的下载和安装教程

    Keil 5的下载与安装 下载和安装教程均在以下百度网盘链接中 链接 xff1a 百度网盘 请输入提取码 https pan baidu com s 11N8EwQRBT 5AzXmW7y1X6A 提取码 xff1a efv3
  • git 远程分支与本地分支

    前言 远程仓库上只有 1 个 master 分支 复制远程仓库的地址 3 克隆远程仓库到本地 一 注意 xff1a 本地的 head 和 master 文件都存在 xff0c 但是 remote 的 master 信息是保存在文件 git
  • ARM 自己动手安装交叉编译工具链

    一 Windows中装软件的特点 Windows中装软件使用安装包 xff0c 安装包解压后有2种情况 xff1a 一种是一个安装文件 xff08 exe msi xff09 xff0c 双击进行安装 xff0c 下一步直到安装完毕 安装完
  • ARM X210开发板的软开关按键问题

    一 X210 开发板的软启动电路详解 x210bv3 pdf 1 210 供电需要的电压比较稳定 xff0c 而外部适配器的输出电压不一定那么稳定 xff0c 因此板载了一个文稳压器件 MP1482 这个稳压芯片的作用就是外部适配器电压在一
  • pyqt5 编写串口通讯上位机_如何使用Python开发串口通讯上位机(二)

    黑色的dos窗口对于大部分来说 xff0c 页面极为不友好 xff0c 且操作不方便 xff0c 因此本篇主要讲讲如何结合QtDesigner创建一个UI并初步与串口Api链接 1 QtDesigner进行上位机页面设计 Python下的软
  • TensorRT介绍

    TensorRT 文章目录 TensorRT训练和推理的区别TensorRTTensorRT 优化和性能TensorRT 工作原理Python APIImporting TensorRT Into PythonCreating A Netw
  • Pytorch 加载图像数据(ImageFolder和Dataloader)

    Pytorch加载图像数据集需要两步 xff0c 首先需要使用 torchvision datasets ImageFolder 读取图像 xff0c 然后再使用torch utils data DataLoader 加载数据集 Image
  • S2A-NET

    S2A NET 文章目录 S2A NET基础知识引言网络架构FAMARNACL 对齐卷积ODM 实现损失函数推理消融实验 参考 基础知识 长边 13 5 135 circ
  • [已解决] New Bing Chat报错: Sorry, looks like your network settings are preventing access to this feature

    文章目录 前因解决方案参考 前因 更改全局XX xff0c 线路选择美国 xff0c 做足一切准备 xff0c 让Bing认为我是一个彻头彻尾的美国用户 高兴地以为终于能在Microsoft Edge Dev版本中体验 New Bing C
  • 腾讯手游助手修改共享目录/缓存目录/Temp文件夹路径

    使用帮助 目录 xff1a https blog csdn net dkbnull article details 87933584 我们在电脑上安装了 腾讯手游助手 后 xff0c 发现 腾讯手游助手 的 缓存目录 游戏安装目录 共享目录
  • 【大学时光】回首向来萧瑟处,归去,也无风雨也无晴

    现状 自2023年始 xff0c 人生突遇大变 相恋四年的男友 xff0c 本以为要携手步入婚姻 xff0c 奈何由于对方母亲的缘故 xff0c 不得不忍痛舍弃四年的感情 同时间段 xff0c 因实在无法再忍受不了组内的PUA气氛 xff0
  • ChatGPT背后的技术:人类反馈强化学习RLHF

    文章目录 前言Chat GPT是如何基于RLHF进行训练的RLHF 技术分解预训练语言模型训练奖励模型强化学习微调预训练模型 局限性参考 前言 随着OpenAI推出的Chat GPT火热出圈 xff0c Chat GPT背后的技术原理之一
  • 【YOLO 系列】YOLO v4-v5先验知识

    文章目录 输入端Mosaic数据增强Self Adversarial TrainingCmBN 主干网络Mish激活函数DropBlock 正则化CSPNetFocus结构 NeckPANet 输出目标损失函数IoU LossGIoU Lo

随机推荐