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

Semaphore(信号量)

信号量就是通过AQS的共享锁机制来实现的。这个类总体比较简单,就不做过多描述。

Sync同步器

abstract static class Sync extends AbstractQueuedSynchronizer {private static final long serialVersionUID = 1192457210091910933L;//初始化permits许可数,并用AQS的state来存放许可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))return remaining;}}//释放共享锁实现protected final boolean tryReleaseShared(int releases) {for (;;) {int current = getState();int next = current + releases;if (next < current) // 相加后小于原值,证明溢出了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) // underflowthrow new Error("Permit count underflow");if (compareAndSetState(current, next))return;}}final int drainPermits() {for (;;) {int current = getState();if (current == 0 || compareAndSetState(current, 0))return current;}}
}//非公平实现
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);}
}
//公平实现
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;}}
}

acquire

public void acquire() throws InterruptedException {//调用AQS的可响应中断获取共享锁的方法sync.acquireSharedInterruptibly(1);
}

http://www.lryc.cn/news/198620.html

相关文章:

  • InnoDB 与 MyISAM的比较(含其他存储引擎)
  • 系统韧性研究(2)|系统韧性如何关联其他质量属性?
  • 电脑桌面记事本便签软件哪个好?
  • 可视化(Visual) SQL初探
  • 多目标权重融合方式
  • 软件工程与计算总结(二十)软件交付
  • 02 开闭原则
  • LamdaUpdateWapper失效问题
  • “权限之舞:Linux安全之道”
  • Visual Studio Code官网下载、vscode下载很慢、vscode下载不了 解决方案
  • URL、域名和网址的区别
  • 【oceanbase】centos7/kylinv10部署oceanbase(x86版本)
  • 论文导读 | 支持事务与图分析的图存储系统
  • Vue3最佳实践 第八章 ESLint 与 测试 ( ESLint )
  • 【C++】命名空间和using namespace std的注意事项
  • 修改51单片机中数组元素的值
  • Ruby和面向对象技术
  • C++11常用新特性——可变参数模板
  • SpringCloud-Seata
  • java击球小游戏运行代码
  • Hadoop面试题+详解
  • PDF编辑阅读:Acrobat Pro DC 2021中文稳定版
  • 单词规律(C++解法)
  • MySQL 主从复制原理
  • 构建嵌入式Linux rootfs根文件系统
  • 高速电路设计----第三章
  • 【微信小程序】6天精准入门(第4天:自定义组件及案例界面)附源码
  • pragma once与ifndef的区别
  • 52单片机独立键盘控制数码管计数
  • 完美解决 在将最终稿件上传到 IEEE PDF eXpress进行格式检查是出现“font not embedded“的问题 (不会出现自动压缩图像的现象)