semaphore信号量使用+原理分析

1.概述

Semaphore 信号量,相当于一个计数器,通常用来限制线程的数量。 每个线程操作前会先获取一个许可证,逻辑处理完成之后就归还这个许可证。

通俗的解释:相当于一个停车场,有10个停车位,进来一个车,占一个停车位,停满了,再有车进来,就要在门口等待, 等出去了一个车,就可以再进来一个车。

2.使用

public class SemaphoreTest {// 定义10个线程private static int THREAD_COUNT = 10;public static void main(String[] args) {ExecutorService executorService = Executors.newFixedThreadPool(THREAD_COUNT);//指定最多只能有五个线程同时执行Semaphore semaphore = new Semaphore(5);for (int i = 0; i < 10; i++) {final int no = i;executorService.execute(new Runnable() {@Overridepublic void run() {try {//获得许可,如果当前没有可用的许可证,则该线程将被阻塞,直到有可用的许可证为止semaphore.acquire();System.out.println("线程名称: " + Thread.currentThread().getName() + "," + no + "获得许可,时间" + LocalDateTime.now());//模拟车辆通行耗时Thread.sleep(2000);//释放许可semaphore.release();} catch (InterruptedException e) {e.printStackTrace();}}});}executorService.shutdown();}}

3.运行结果:

 只能有5个线程同时运行。另外5个被堵塞了。

4.原理分析

4.1 构造方法

4.2 获取许可证

semaphore.acquire()

 

 

 

4.3 可中断的共享锁:doAcquireSharedInterruptibly 

 4.4 公平跟非公平锁的区别

AQS 的 hasQueuedPredecessors()

 4.5 hasQueuedPredecessors

通过 #hasQueuedPredecessors() 方法,判断该线程是否位于 CLH 队列的列头,从而实现公平锁。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

比较器仿真PSS+PNOISE测噪声

没有目录标题 一、参考二、PSSPnoise测输入噪声电压三、具体步骤&#xff1a;1.设置PSS&#xff1a;2.设置pnoise&#xff1a;3.根据仿真结果计算输出噪声电压 4.计算比较器的gain和输入噪声电压4.1 计算gain的方式一和对应的输入噪声电压4.2 计算gain的方式二和对应的输入噪声…

电脑提示msvcp110.dll是什么意思?7个实测有效方法教你搞定

在使用Windows操作系统的过程中&#xff0c;用户难免会遭遇与动态链接库&#xff08;DLL&#xff09;文件相关的问题&#xff0c;其中MSVCP110.dll便是其中之一。作为Microsoft Visual C Redistributable Package的重要组成部分&#xff0c;MSVCP110.dll对于许多基于C开发的应用…

【MySQL 数据宝典】【磁盘结构】- 005 Undo log 撤销日志

一、基本介绍 ​ 每当我们要对一条记录做改动时&#xff08;这里的改动可以指 INSERT 、 DELETE 、 UPDATE &#xff09;&#xff0c;都需要留一手 -> 把回滚时所需的东西都给记下来 ​ 你插入一条记录时&#xff0c;至少要把这条记录的主键值记下来&#xff0c;之后回滚的…

用于便携可穿戴设备的RX8130CE

用于便携可穿戴设备的时钟芯片模块:RX8130CE。时钟芯片模块RX8130CE&#xff0c;其特点是3225小尺寸和电池控制&#xff0c;可应用于可穿戴设备RX8130CE具有自动电源切换功能&#xff0c;可监视电源电压&#xff0c;并通过自动操作切换到备用电源&#xff0c;备用电源的开关电压…

PPT设置日期随改动而更新

点击插入——点击日期和时间 弹出的新窗口中勾选自动更新日期和时间

电脑上怎么调照片尺寸?这几个方法方便又好用

平时我们在制作幻灯片演示时&#xff0c;调整图片的大小可以确保图片适应幻灯片的布局&#xff0c;并提供清晰的展示效果&#xff0c;单张处理起来的话就比较浪费时间&#xff0c;但是通常我们需要批量去修改图片尺寸大小&#xff0c;这就需要用到比较专业的图片处理工具了&…

40-50W 1.5KVDC 隔离 宽电压输入 DC/DC 电源模块 ——TP40(50)DC 系列

TP40(50)DC系列电源模块额定输出功率为40-50W、应用于2:1、4&#xff1a;1电压输入范围 9V-18V、18V-36V、36V-75V、9V-36V、18V-75V的输入电压环境&#xff0c;输出电压精度可达1%&#xff0c;可广泛应用于通信、铁路、自动化以及仪器仪表等行业。

视频不够清晰怎么办?教你几种有效方法

在我们日常生活中&#xff0c;有时候我们会遇到不清晰的视频&#xff0c;这给我们带来了很多不便。那么&#xff0c;怎么将不清晰的视频变清晰呢&#xff1f;本文将为您介绍一些常用的软件工具&#xff0c;帮助您提升视频的清晰度。 方法一&#xff1a;使用AI技术 AI技术可以通…

Python写个二维码

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、进入官网下载二、下载一下三.输入代码 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、进入官网下载 官网 pip insta…

【C++庖丁解牛】C++11---右值引用和移动语义

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1 左值引用和右值引用2 左…

牛客NC179 长度为 K 的重复字符子串【simple 哈希,滑动窗口 C++、Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/eced9a8a4b6c42b79c95ae5625e1d5fd 思路 哈希统计每个字符出现的次数。没在窗口内的字符要删除参考答案C class Solution {public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c…

Day08-Java进阶-递归异常及其处理自定义异常

1. 递归 package com.itheima.recursion;public class RecursionDemo3 {/*不死神兔(斐波那契额数列)*/public static void main(String[] args) {int sum getSum(20);System.out.println(sum);}public static int getSum(int n) {if (n 1 || n 2) {return 1;} else {return …

【nginx】nginx启动显示80端口占用问题的解决方案

目录 &#x1f305;1. 问题描述 &#x1f30a;2. 解决方案 &#x1f305;1. 问题描述 在启动nginx服务的时候显示内容如下&#xff1a; sudo systemctl status nginx 问题出现原因&#xff1a; 根据日志显示&#xff0c;Nginx 服务启动失败&#xff0c;主要原因是无法绑定…

day1c++基础

const char*p;//值不可以改变&#xff0c;地址可以改变 const &#xff08;char*&#xff09;p; //值不可以改变&#xff0c;地址可以改变 char* const p; //值可以改变&#xff0c;地址不可以改变 const char* const p; //值不可以改变&#xff0c;地址不可以改变 char co…

【C++】封装、继承和多态

引言 在现代软件开发中&#xff0c;面向对象编程&#xff08;Object Oriented Programming&#xff09;已经成为一种广泛应用的编程范式。C作为一种支持面向对象编程的语言&#xff0c;在封装、继承和多态方面提供了强大的特性。本文将介绍C中的封装、继承和多态概念&#xff…

element plus:tree拖动节点交换位置和改变层级

图层list里有各种组件&#xff0c;用element plus的tree来渲染&#xff0c;可以把图片等组件到面板里&#xff0c;面板是容器&#xff0c;非容器组件&#xff0c;比如图片、文本等&#xff0c;就不能让其他组件拖进来。 主要在于allow-drop属性的回调函数编写&#xff0c;要理清…

数字逻辑电路基础-有限状态机

文章目录 一、有限状态机基本结构二、verilog写一个基础有限状态机(moore型状态机)三、完整代码一、有限状态机基本结构 本文主要介绍使用verilog编写有限状态机FSM(finite state machine),它主要由三部分组成,下一状态逻辑电路,当前状态时序逻辑电路和输出逻辑电路。 有…

ZYNQ之嵌入式开发04——自定义IP核实现呼吸灯、固化程序

文章目录 自定义IP核——呼吸灯实验固化程序 自定义IP核——呼吸灯实验 Xilinx官方提供了很多IP核&#xff0c;在Vivado的IP Catalog中可以查看这些IP核&#xff0c;在构建自己复杂的系统时&#xff0c;只使用Xilinx官方的免费IP核一般满足不了设计的要求&#xff0c;因此很多…

NOIP,CSP-J,CSP-S——高精度加减乘除

一、高精度加法 1、大整数的输入 int的范围,正负上下限大约为2.1*10^9; long long的范围,正负上下限大约为9.2*10^18; 如果整数成千上万位,那么这么大的整数我们如何处理? 方法:先用字符串输入,然后把每一个字符转换成为数字,存到一个int数组里 int数组中的一个位…

揭秘Faiss:大规模相似性搜索与聚类的技术神器深度解析!

Faiss&#xff08;由Facebook AI Research开发&#xff09;是一个用于高效相似性搜索和密集向量聚类的库。它用C编写&#xff0c;并提供Python绑定&#xff0c;旨在帮助研究人员和工程师在大规模数据集上进行快速的相似性搜索和聚类操作。 一、介绍&#xff1a; Faiss的核心功…