基于AQS实现的简单的Semaphore
时间:2022-07-24
本文章向大家介绍基于AQS实现的简单的Semaphore,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
/**
* @Auther: ZhangShenao
* @Date: 2019/3/3 11:15
* @Description:自定义Semaphore,内部通过Sync同步器继承了AQS,采用共享的方式获取资源
*/
public class SimpleSemaphore {
private Sync sync;
public SimpleSemaphore(int permits){
sync = new Sync(permits);
}
public void acquire(){
sync.acquireShared(1);
}
public void release(){
sync.releaseShared(1);
}
static class Sync extends AbstractQueuedSynchronizer {
public Sync(int permits) {
if (permits <= 0) {
throw new IllegalArgumentException("Permits must be positive!!");
}
setState(permits);
}
@Override
protected int tryAcquireShared(int reduce) {
for (; ; ) {
int current = getState();
int remains = current - reduce;
if (remains < 0 || compareAndSetState(current, remains)) {
return remains;
}
}
}
@Override
protected boolean tryReleaseShared(int released) {
for (; ; ) {
int current = getState();
int updated = current + released;
if (updated < current){
throw new RuntimeException("Maximum permit count exceeded!!");
}
if (compareAndSetState(current, updated)) {
return true;
}
}
}
}
}
- 压力测试中存在的问题
- 这或许是对小白最友好的python入门了吧——18,用while循环处理列表
- 如何在js中将统计代码图标隐藏
- 警惕IT黑洞
- 这或许是对小白最友好的python入门了吧——17,while循环
- 泛型介绍(接上一篇,具体的事例随后呈上)
- PHP高级编程之守护进程
- 看到他我一下子就悟了-- 泛型(2)
- ExtJS4中设置tabpanel的tab高度问题
- Oracle写错误与文件离线
- 看到他我一下子就悟了-- 泛型(1)
- EXTJS4 Grid Filter 插件的使用 与后台数据解析------Extjs 查询筛选功能的实现
- [Java]读取文件方法大全
- WPF Application 类介绍以及怎样修改启动方式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java程序员必须搞懂的 Linux 知识大全!
- Java 8 有多牛逼?打破一切你对接口的认知!
- 写了个牛逼的日志切面,甩锅更方便了!
- iOS开发之CryptoKit
- koroFileHeader更新日志
- 掌握浏览器重绘(reflow)重排(repaint)-前端进阶
- var和let/const的区别
- 刷新/关闭页面之前发送请求
- Web Beacon 刷新/关闭页面之前发送请求
- 解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
- python3 logging日志封装实例
- 解决Python中报错TypeError: must be str, not bytes问题
- H5 notification浏览器桌面通知
- Android线程池控制并发数多线程下载
- Android progressbar实现带底部指示器和文字的进度条