当前位置: 首页 > news >正文

并发控制之Semaphore

Semaphore

作用

信号量,用于控制同时访问特定资源的线程数量,通过协调各个线程,以确保对共享资源的访问不会导致冲突或数据不一致等问题,有点类似令牌桶,内部维护一组许可证,

acquire获取许可证,获取到了就执行,没获取到就阻塞直到有许可证

release 释放许可证

示例代码

import java.util.concurrent.Semaphore;public class Test {public static void main(String[] args) {final Semaphore semaphore = new Semaphore(4);for (int i = 0; i < 5; i++) {new Thread(() -> {try {semaphore.acquire();// 获取许可证,没获取到就阻塞在这里System.out.println(Thread.currentThread().getName() + " 获得许可证,开始执行任务");Thread.sleep((long) (Math.random() * 1000));System.out.println(Thread.currentThread().getName() + " 执行任务完毕,释放许可证");semaphore.release();// 执行完毕释放许可证} catch (InterruptedException e) {e.printStackTrace();}}).start();}}
}

实现原理

static final class NonfairSync extends Sync {private static final long serialVersionUID = -2694183684443567898L;NonfairSync(int permits) {super(permits);}protected int tryAcquireShared(int acquires) {return nonfairTryAcquireShared(acquires);}}/*** Fair version*/static final class FairSync extends Sync {private static final long serialVersionUID = 2014338818796000944L;FairSync(int permits) {super(permits);}protected int tryAcquireShared(int acquires) {for (;;) {if (hasQueuedPredecessors())return -1;int available = getState();int remaining = available - acquires;if (remaining < 0 ||compareAndSetState(available, remaining))return remaining;}}}

内部通过继承AbstractQueuedSynchronizer来实现其功能,有公平锁和非公平锁的实现,调用acquire方法,判断当前许可证数量大于0,就是用CAS操作许可证数量减1,线程就可以执行

许可证数量等于0 ,就把线程加入到AQS的等待队列中等待唤醒获取许可证再执行

相关文章:

并发控制之Semaphore

Semaphore 作用 信号量&#xff0c;用于控制同时访问特定资源的线程数量&#xff0c;通过协调各个线程&#xff0c;以确保对共享资源的访问不会导致冲突或数据不一致等问题&#xff0c;有点类似令牌桶&#xff0c;内部维护一组许可证&#xff0c; acquire获取许可证&#xf…...

第R3周:RNN-心脏病预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 &#x1f37a;要求&#xff1a; 1 本地读取并加载数据。 2 了解循环神经网络&#xff08;RNN&#xff09;的构建过程 3 测试集accuracy到达87% &#x1f37b;拔…...

【数值特性库】入口文件

数值特性库入口文件为lib.rs。该文件定义一系列数字特性的trait&#xff08;特征&#xff09;&#xff0c;这些特性可以被不同的数字类型实现&#xff0c;从而提供一套通用的数值操作方法。下面是对代码中关键部分的解释&#xff1a; 一、基础设置 #![doc(html_root_url “h…...

RestTemplate实时接收Chunked编码传输的HTTP Response

学习调用AI接口的时候&#xff0c;流式响应都是使用的 Transfer-Encoding: chunked&#xff0c;图方便想用RestTemplate&#xff0c;但是平时用到的都是直接返回响应对象的类型。使用bing搜索到一种方式&#xff0c;使用下面的代码来读取&#xff0c;于是掉这个坑里了&#xff…...

GIT区域介绍及码云+GIt配置仓库

GIT区域介绍 创建文件夹git init 1、git有3个区域 工作区&#xff08;working directory&#xff09;&#xff1a;项目的根目录&#xff0c;不包 括.git在内的其他文件暂存区&#xff08;stage area&#xff09;&#xff1a;是一个看不见的区域&#xff0c;git add 命令就是将文…...

网络安全怎么学习

当我们谈论网络安全时&#xff0c;我们正在讨论的是保护我们的在线空间&#xff0c;这是我们所有人的共享责任。网络安全涉及保护我们的信息&#xff0c;防止被未经授权的人访问、披露、破坏或修改。 一、网络安全的基本概念 网络安全是一种保护&#xff1a;它涉及保护我们的设…...

PugiXML,一个高效且简单的 C++ XML 解析库!

嗨&#xff0c;大家好&#xff01;我是一行。今天要给大家介绍 PugiXML&#xff0c;这可是 C 里处理 XML 数据的得力助手。它能轻松地读取、修改和写入 XML 文件&#xff0c;就像一个专业的 XML 小管家&#xff0c;不管是解析配置文件&#xff0c;还是处理网页数据&#xff0c;…...

Linux设备树的驱动开发

概述 本文介绍了platform框架下的设备驱动开发流程和方法&#xff0c;主要包括设备树、驱动程序和应用程序的开发。以随机数驱动为例&#xff0c;实现了应用程序调用库函数&#xff0c;通过系统调用陷入内核&#xff0c;最后执行硬件驱动&#xff0c;获取真随机数的过程。 添…...

连锁?下沉?AI?2025年餐饮新活力!

如果要用几个词来形容 2024 年的餐饮业&#xff0c;这些词大概率会是「卷、难、惨」&#xff0c;用著名商业顾问刘润的话来说就是「卷到极致」。虽然餐饮人在社交平台上叫苦连天&#xff0c;但当我们查看餐饮大盘数据时发现&#xff0c;大盘在涨&#xff0c;与个体餐饮人的实感…...

Javascript中如何实现函数缓存?函数缓存有哪些应用场景?

今天要聊的一个很经典的问题——如何在JavaScript中实现函数缓存&#xff0c;以及它有哪些应用场景。 我们先来明确一下&#xff0c;函数缓存是什么。简单来说&#xff0c;函数缓存是将函数的运算结果存储起来&#xff0c;以便下次用到相同的输入时&#xff0c;可以直接返回结…...

子页面访问父页面

子页面访问父页面的方式主要依赖于页面之间的关系&#xff0c;特别是它们是否处于同一域、是否是嵌套在 <iframe> 中、或者通过弹出窗口打开。下面是几种常见的子页面访问父页面的方法&#xff1a; 1. 通过 window.parent 访问父页面&#xff08;适用于嵌套的 iframe&am…...

芯片级IO (Pad) Ring IP Checklist

SoC top顶层数字后端实现都会涉及到IO Ring &#xff08;PAD Ring&#xff09;的设计。这里面包括VDD IO,VDDIO IO, Signal IO, Corner IO&#xff0c;Filler IO&#xff0c;IO power cut cell等等。 数字后端零基础入门系列 | Innovus零基础LAB学习Day2 数字IC后端实现TOP F…...

计算机毕业设计论文指导

计算机毕业设计论文指导 计算机毕业设计辅导一站式&#xff01;太香了&#x1f4aa; [赞R][赞R][赞R]嗨喽&#xff01;计算机专业的宝子们&#xff01; 计算机毕设辅导专业靠谱的他来了&#xff01;&#xff01; 是不是还在为选题程序不会做而感到苦难&#xff1f; 论文没思路赶…...

Electron-Vue 开发下 dev/prod/webpack server各种路径设置汇总

背景 在实际开发中&#xff0c;我发现团队对于这几个路径的设置上是纯靠猜的&#xff0c;通过一点点地尝试来找到可行的路径&#xff0c;这是不应该的&#xff0c;我们应该很清晰地了解这几个概念&#xff0c;以下通过截图和代码进行细节讲解。 npm run dev 下的路径如何处理&…...

Vue.js前端框架教程9:Vue插槽slot用法

文章目录 插槽&#xff08;Slots&#xff09;无名插槽&#xff08;默认插槽&#xff09;具名插槽reference 插槽使用 v-slot 的缩写语法 插槽&#xff08;Slots&#xff09; 在 Vue 中&#xff0c;插槽&#xff08;Slots&#xff09;是一种组件内容分发的机制&#xff0c;允许…...

初学stm32 --- NVIC中断

目录 STM32 NVIC 中断优先级管理 NVIC_Type: ISER[8]&#xff1a; ICER[8]&#xff1a; ISPR[8]&#xff1a; ICPR[8]&#xff1a; IABR[8]&#xff1a; IP[240]&#xff1a; STM32 的中断分组&#xff1a; 中断优先级分组函数 NVIC_PriorityGroupConfig 中断初始化函…...

Jest 入门指南:从零开始编写 JavaScript 单元测试

前言 在前端开发中&#xff0c;单元测试已经成为确保代码质量和稳定性的关键步骤。Jest 作为由 Facebook 开发和维护的功能强大的 JavaScript 测试框架&#xff0c;以其易于配置、丰富的功能和开箱即用的特性&#xff0c;成为众多开发者的首选工具。本文旨在引导你从零开始&am…...

【Java Web】Axios实现前后端数据异步交互

目录 一、Promise概述 二、Promise基本用法 三、async和await关键字 四、Axios介绍 4.1 Axios基本用法 4.2 Axios简化用法之get和post方法 五、Axios拦截器 六、跨域问题处理 一、Promise概述 axios是代替原生的ajax实现前后端数据交互的一套新解决方案&#xff0c;而…...

React 第十七节 useMemo用法详解

概述 useMemo 是React 中的一个HOOK&#xff0c;用于根据依赖在每次渲染时候缓存计算结果&#xff1b; 大白话就是&#xff0c;只有依赖项发生变化时候&#xff0c;才会重新渲染为新计算的值&#xff0c;否则就还是取原来的值&#xff0c;有点类似 vue 中的 computed 计算属性…...

鸿蒙项目云捐助第十五讲云数据库的初步使用

鸿蒙项目云捐助第十五讲云数据库的初步使用 在华为云技术使用中&#xff0c;前面使用了云函数&#xff0c;接下来看一下华为云技术中的另外一个技术云数据库的使用。 一、云数据库的创建 这里使用华为云数据库也需要登录到AppGallery Connect平台中&#xff0c;点击进入到之…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...