当前位置: 首页 > 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;点击进入到之…...

**雾计算中的边缘智能:基于Python的轻量级任务调度系统设计与实现**在物联网(IoT)飞速发展的今天,传统云

雾计算中的边缘智能&#xff1a;基于Python的轻量级任务调度系统设计与实现 在物联网&#xff08;IoT&#xff09;飞速发展的今天&#xff0c;传统云计算模式已难以满足低延迟、高带宽和实时响应的需求。**雾计算&#xff08;Fog Computing&#xff09;**作为云与终端设备之间的…...

Windows屏幕取色器ColorWanted:设计师和开发者的效率神器

Windows屏幕取色器ColorWanted&#xff1a;设计师和开发者的效率神器 【免费下载链接】ColorWanted Screen color picker for Windows (Windows 上的屏幕取色器) 项目地址: https://gitcode.com/gh_mirrors/co/ColorWanted 你是否经常需要在设计软件、网页开发或UI设计中…...

从apt-get到yum:Ubuntu20.04下跨平台包管理工具安装指南

从apt-get到yum&#xff1a;Ubuntu 20.04下跨平台包管理工具实战指南 在Linux生态中&#xff0c;不同发行版采用不同的包管理系统——Debian系的apt与RedHat系的yum就是典型代表。当开发者需要在Ubuntu环境下运行原本为CentOS设计的软件时&#xff0c;掌握yum的安装与配置技巧能…...

别再只玩单机了!用AirSim+Python实现你的第一个无人机编队(附完整代码)

从单机到编队&#xff1a;用AirSim和Python打造你的第一支无人机小队 想象一下&#xff0c;当你第一次在AirSim中成功让无人机起飞时的兴奋感——现在&#xff0c;是时候将这份快乐乘以N倍了。本文将带你跨越单机操作的舒适区&#xff0c;进入无人机编队控制的新世界。不需要复…...

用Arduino和TCS34725颜色传感器做个桌面小助手:自动识别物体颜色并控制RGB灯带

用Arduino和TCS34725打造智能色彩互动系统&#xff1a;从硬件搭建到场景应用 在创客圈里&#xff0c;色彩交互一直是个充满魅力的领域。想象一下&#xff1a;当你把一杯橙汁放在桌面上&#xff0c;周围的灯光自动变成温暖的橙色&#xff1b;放上一本蓝色封面的书&#xff0c;工…...

Ubuntu下ibus输入法全拼与双拼切换疑难解析+VNC远程输入法同步失效解决方案

1. 全拼与双拼模式切换问题解析 第一次在Ubuntu上使用ibus输入法时&#xff0c;很多人会发现输入"zhong"却出现"zang ong"这样的错误候选词。这其实是因为ibus默认启用了双拼模式&#xff0c;而大多数用户更习惯使用全拼输入。双拼模式要求每个汉字只需输…...

MSSQL03:SQLServer数据库中的高级语法及其技巧

目录 一、日期相关 1.查询当前日期相关数据 2.查询特定时间区间 3.时间加减法 &#xff08;1&#xff09;加法 &#xff08;2&#xff09;减法 4.格式化日期 二、数据类型转化 1.Int -> Decimal 2.DateTime->OtherTime 3.DateTime->string 三、条件判断相关…...

超导电路阵列实验方案 V1.0桌面量子引力实验(自指动力学与类时空关联涌现)

超导电路阵列实验方案 V1.0 桌面量子引力实验&#xff08;自指动力学与类时空关联涌现&#xff09; 方案编号&#xff1a;SR-EXP-QG-001 版本&#xff1a;V1.0 一、核心科学目标 1. 科学目标 在一维/二维超导量子比特阵列中&#xff0c;引入全局量子态测量 实时反馈构建强自指…...

国密双证书体系深度解读:为什么你的GMTLS客户端需要两个证书?从ECC到ECDHE模式全解析

国密双证书体系深度解析&#xff1a;从设计哲学到工程实践 当开发者第一次接触国密GMTLS协议时&#xff0c;最令人困惑的莫过于那个看似"多余"的第二个证书。为什么在标准TLS中运行良好的单证书体系&#xff0c;到了国密环境中就需要拆分成加密证书和签名证书&#x…...

一开口就聊到客户心坎里的沟通话术

先把人聊顺&#xff0c;事自然就顺了一位资深顾问&#xff0c;老客户复购和转介绍特别多。她的秘诀很简单&#xff1a;先聊人&#xff0c;再聊事。有次对接一位态度疏离的客户&#xff0c;她没直接问方案&#xff0c;而是看到客户朋友圈刚出去玩&#xff0c;便说&#xff1a;“…...