贵有恒,何必三更起、五更眠、最无益,只怕一日曝、十日寒。这篇文章主要讲述#yyds干货盘点# Semaphore详解相关的知识,希望能为你提供帮助。
Semaphore详解
Semaphore源码分析
类的继承关系
public class Semaphore implements java.io.Serializable
说明: Semaphore实现了Serializable接口,即可以进行序列化。
类的内部类
Semaphore总共有三个内部类,并且三个内部类是紧密相关的
说明: Semaphore与ReentrantLock的内部类的结构相同,类内部总共存在Sync、NonfairSync、FairSync三个类,NonfairSync与FairSync类继承自Sync类,Sync类继承自AbstractQueuedSynchronizer抽象类。下面逐个进行分析。
类的内部类 - Sync类
Sync类的源码如下
// 内部类,继承自AQS
abstract static class Sync extends AbstractQueuedSynchronizer
// 版本号
private static final long serialVersionUID = 1192457210091910933L;
// 构造函数
Sync(int permits)
// 设置状态数
setState(permits);
// 获取许可
final int getPermits()
return getState();
// 共享模式下非公平策略获取
final int nonfairTryAcquireShared(int acquires)
for (; ; )// 无限循环
// 获取许可数
int available = getState();
// 剩余的许可
int remaining = available - acquires;
if (remaining < 0 ||
compareAndSetState(available, remaining)) // 许可小于0或者比较并且设置状态成功
return remaining;
// 共享模式下进行释放
protected final boolean tryReleaseShared(int releases)
for (; ; )// 无限循环
// 获取许可
int current = getState();
// 可用的许可
int next = current + releases;
if (next < current) // overflow
throw new Error("Maximum permit count exceeded");
if (compareAndSetState(current, next)) // 比较并进行设置成功
return true;
// 根据指定的缩减量减小可用许可的数目
final void reducePermits(int reductions)
for (; ; )// 无限循环
// 获取许可
int current = getState();
// 可用的许可
int next = current - reductions;
if (next > current) // underflow
throw new Error("Permit count underflow");
if (compareAndSetState(current, next)) // 比较并进行设置成功
return;
// 获取并返回立即可用的所有许可
final int drainPermits()
for (; ; )// 无限循环
// 获取许可
int current = getState();
if (current == 0 || compareAndSetState(current, 0)) // 许可为0或者比较并设置成功
return current;
类的内部类 - NonfairSync类
NonfairSync类继承了Sync类,表示采用非公平策略获取资源,其只有一个tryAcquireShared方法,重写了AQS的该方法,其源码如下:
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);
说明: 从tryAcquireShared方法的源码可知,其会调用父类Sync的nonfairTryAcquireShared方法,表示按照非公平策略进行资源的获取。
【#yyds干货盘点# Semaphore详解】类的内部类 - FairSync类
FairSync类继承了Sync类,表示采用公平策略获取资源,其只有一个tryAcquireShared方法,重写了AQS的该方法,其源码如下。
protected int tryAcquireShared(int acquires)
for (; ; )// 无限循环
if (hasQueuedPredecessors()) // 同步队列中存在其他节点
return -1;
// 获取许可
int available = getState();
// 剩余的许可
int remaining = available - acquires;
if (remaining < 0 ||
compareAndSetState(available, remaining)) // 剩余的许可小于0或者比较设置成功
return remaining;
推荐阅读
- TASKCTL服务端字符界面的应用系统安装
- Docker 安装 Seafile 版企业网盘
- netty系列之:netty中的frame解码器
- 我招了个“水货”程序员
- 使用BypassCustomPluginExecution参数忽略插件逻辑
- #yyds干货盘点# 解决华为机试(记负均正II)
- Linux 安装Mariadb以及主从搭建
- OpenHarmony——散点图
- 算法题每日一练---第22天(猜字母(String类))