当前位置:网站首页>Semaphore 基本原理
Semaphore 基本原理
2022-08-04 15:07:00 【斯沃福德】
1. 概述
引入:
Semaphore 信号量是一个计数器,用来限制访问资源的线程的个数; 而不是限制的资源的个数;
Semaphore 和ReentrantLock的区别:
ReentrantLock只允许同一时刻线程的独占,
而Semaphore用在共享资源有多个,也允许多个线程来访问这些资源;只是希望对访问的线程上限加以限制;
两者底层都基于AQS;
使用场景:
1.使用 semaphore限流,访问高峰期时,让超出线程上限的请求线程阻塞,高峰期过去再释放许可;
2. 原理
2. 1 构造
semaphore构造函数和ReentrantLock一样,返回FairSnyc或NonfairSync; 这俩同步器继承自Sync,最终继承自AQS !
使用state来表示资源数量,也就是信号量,semaphore的构造函数需要指定state数量;


在Sync类中,用setState()将信号量数量permits会传给state;

2. 2 acquire() 获取资源
- 先获取State,然后使用CAS机制将state值改为减1,并返回剩余资源数; 如果剩余资源数大于0则获取成功;
- 如果state减1之后小于0 ,线程进入阻塞队列等待:
①addWaiter() 先创建节点关联当前线程,
②加入阻塞队列的末尾,并将前驱节点的waitStatues设为-1 ,
③找到头节点,再尝试获取一次,失败则将当前线程park阻塞;
tryAcquireShared() 返回的是剩余的资源的数量,如果为负则表示失败,正数则成功;

尝试使用CAS修改state,默认参数acquires是1,如果state<0或者修改成功,则将结果返回;
如果结果返回是state<0,则要阻塞当前线程:
执行addWaiter() 先创建节点关联当前线程,加入阻塞队列,并将前驱节点设为-1;
找到头节点,再尝试获取一次,失败则将当前线程阻塞park;
2. 3 release() 释放资源
- 先拿到state,使用CAS机制将staet加 1,
- state释放成功就获取head头节点,如果head不为null 且weaitStatus是-1,就用unParkSuccsor() 释放头节点的后继节点;


边栏推荐
- 【Today in History】August 4: First female Turing Award winner; NVIDIA acquires MediaQ; first Cybersecurity Challenge completed
- Next -21- 添加相册系列 - 1- 框架设置
- C# 谁改了我的代码
- 特殊品种的二次开户验资金额
- 本周讨论用户体验:Daedalus 的 Nemo 加入 Ambire,探索加密海洋
- 用了TCP协议,就一定不会丢包吗?
- RS|哨兵二号(.SAFE格式)转tif格式
- leetcode: 253. How many meeting rooms are required at least
- leetcode: 251. Expanding 2D Vectors
- 期货开户之前要谈好最低手续费和交返
猜你喜欢

Basic Introduction for PLSQL

郑轻新生校赛和中工选拔赛题解
ping的原理

I/O stream summary
![[Beiya data recovery] IBM System Storage storage lvm information lost data recovery solution](/img/1c/3c8c323e6ee3406d202e07f85bab21.jpg)
[Beiya data recovery] IBM System Storage storage lvm information lost data recovery solution

1403. Minimum Subsequence in Non-Increasing Order

【云原生 | 从零开始学Kubernetes】kubernetes之StatefulSet详解

用于X射线聚焦的复合折射透镜

Google plug-in. Download contents file is automatically deleted after solution

Bluetooth Technology|In the first half of the year, 1.3 million charging piles were added nationwide, and Bluetooth charging piles will become the mainstream of the market
随机推荐
leetcode: 253. How many meeting rooms are required at least
leetcode:259. 较小的三数之和
《分布式云最佳实践》分论坛,8月11日深圳见
AOSP内置APP特许权限白名单
Next -20- 使用自定义样式 (custom style)
技术分享| 小程序实现音视频通话
MySQL优化学习笔记
Redis-主从复制
leetcode:255 验证前序遍历序列二叉搜索树
7 天找个 Go 工作,Gopher 要学的条件语句,循环语句 ,第3篇
leetcode: 250. Count subtrees of equal value
【云原生 | 从零开始学Kubernetes】kubernetes之StatefulSet详解
leetcode: 255 Verify preorder traversal sequence binary search tree
eNSP-小型网络拓扑(DNS、DHCP、网站服务器、无线路由器)
我爱七夕哈哈哈
【Harmony OS】【FAQ】鸿蒙问题合集2
C# BBcode 转 Markdown
365天挑战LeetCode1000题——Day 049 非递增顺序的最小子序列 贪心
leetcode: 254. Combinations of factors
Http-Sumggling缓存漏洞分析