java中使用Semaphore构建阻塞对象池

Semaphore是java 5中引入的概念,叫做计数信号量。主要用来控制同时访问某个特定资源的访问数量或者执行某个操作的数量。

Semaphore中定义了一组虚拟的permits,通过获取和释放这些permits,Semaphore可以控制资源的个数。

Semaphore的这个特性可以用来构造资源池,比如数据库连接池等。

Semaphore有两个构造函数:

    public Semaphore(int permits) {sync = new NonfairSync(permits);}
    public Semaphore(int permits, boolean fair) {sync = fair ? new FairSync(permits) : new NonfairSync(permits);}

permits定义了许可资源的个数,而fair则表示是否支持FIFO的顺序。

两个比较常用的方法就是acquire和release了。

    public void acquire() throws InterruptedException {sync.acquireSharedInterruptibly(1);}
    public void release() {sync.releaseShared(1);}

其中acquire用来获取资源,release用来释放资源。

有了这两个特性, 我们看一下怎么使用Semaphore来定义一个一个有界容器。

我们可以将Semaphore初始化为容器池大小,并且在容器池获取资源时调用acquire,将资源返回给容器池之后再调用release。

我们看下面的一个实现:

public class SemaphoreUsage<T> {private final Set<T> set;private final Semaphore sem;public SemaphoreUsage(int bound){this.set = Collections.synchronizedSet(new HashSet<T>());sem= new Semaphore(bound);}public boolean add (T o) throws InterruptedException{sem.acquire();boolean wasAdded = false;try{wasAdded=set.add(o);return wasAdded;}finally {if(!wasAdded){sem.release();}}}public boolean remove(Object o){boolean wasRemoved = set.remove(o);if(wasRemoved){sem.release();}return wasRemoved;}}

上面的例子我们定义了一个有界的synchronizedSet。 要注意一点是在add方法中,只有add成功之后才会调用release方法。

本文的例子请参考https://github.com/ddean2009/learn-java-concurrency/tree/master/Semaphore

更多精彩内容且看:

  • 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
  • Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
  • Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
  • java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程

更多内容请访问 flydean的博客

java中使用Semaphore构建阻塞对象池相关推荐

  1. java堆和栈 常量池_GitHub - han-guang-xue/difference-of-stack-heap-pool: Java中堆、栈和常量池的区别...

    Java中堆.栈和常量池的区别 栈 堆 常量池的概念 首先我们先了解一下概念,Java把内存分成两种,一种叫做栈内存,一种叫做堆内存. 栈内存 存放基本类型的变量数据和对象类型的引用(请注意存放的是引 ...

  2. Java中堆、栈、常量池等概念解析

    Java中堆.栈.常量池等概念解析 程序运行时,我们最好对数据保存到什么地方做到心中有数.特别要注意的是内存的分配.有六个地方都可以保存数据: (1) 寄存器.这是最快的保存区域,因为它位于和其他所有 ...

  3. Java中,一切皆是对象,为何数据类型中还分为:基本类型和对象?

    Java中,一切皆是对象!为何数据类型中还分为:基本类型和对象?按理不应该只有一个类型-对象吗? 1.首先,Java中一切皆是对象!这句话没错,因为八种基本类型都有对应的包装类(int的包装类是Int ...

  4. Java 中,类、类对象、泛型之间的转换

    Java 中,类.类对象.泛型之间的转换 R 为非泛型 获得类 通过类型名来获得类 通过对象来获得类 通过类名字符串来获得类 通过类来获得类名字符串 通过类来获得对象 使用 R 的无参数构造器来创建对 ...

  5. Java中的垃圾回收与对象生命周期

    转载自   Java中的垃圾回收与对象生命周期 1. 垃圾回收 垃圾回收是Java程序设计中内存管理的核心概念,JVM的内存管理机制被称为垃圾回收机制. 一个对象创建后被放置在JVM的堆内存中,当永远 ...

  6. Java中Comparable和Comparator实现对象比较

    Java中Comparable和Comparator实现对象比较 目录 一. Comparator 二. Comparable 三.比较 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comp ...

  7. Java中创建(实例化)对象的五种方式

    Java中创建(实例化)对象的五种方式 1.用new语句创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23);  3.运 ...

  8. Java中的NIO非阻塞编程

    在JDK1.4以前,Java的IO操作集中在java.io这个包中,是基于流的阻塞API.对于大多数应用来说,这样的API使用很方便,然而,一些对性能要求较高的应用,尤其是服务端应用,往往需要一个更为 ...

  9. java中存在对多个对象加锁的情况_Java对象锁和类锁全面解析(多线程synchronized关键字)...

    最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念.最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没 ...

最新文章

  1. [04] 前端构建工具区别
  2. shell去除字符串前所有的0
  3. POJ-1321-棋盘问题(深搜)
  4. linux pdf转换swf,CENTOS 5   PDF转换为SWF
  5. 总奖金近9万!视频超分辨率大赛等你来战!
  6. SPARK:作业基本运行原理
  7. PAT_甲级_1002_C语言
  8. Linux下将数据文件的指定域读取到shell脚本中
  9. 英语学习笔记2019-9-27
  10. sm2算法前端处理_Postman接口自动化测试实例用到的完整的SM2前端加密算法代码...
  11. qt 控件坐标系_Qt中,如何找准控件坐标
  12. 扫描服务器用户,服务器安全工具(自动扫描后门路径)
  13. U盘插入电脑后,提示需要格式化U盘如何解决?
  14. C++ PRIMER 5TH 课后题答案1.16
  15. ie11无法播放html,IE11无法显示flash?IE11无法播放视频的解决方法
  16. DETR | 基于匈牙利算法的样本分配策略
  17. 学习fullpage的使用
  18. 2017世界GDP排行地图可视化
  19. 动物视觉感知进化的一些看法
  20. 关于LINUX系统netterm终端登陆乱码问题。

热门文章

  1. Java jdbctemplate赋值_JDBCTemplate基本使用
  2. 数据库的同步和复制----sql语句方法
  3. 【网络编程】之十三、ping程序实现
  4. SQL Server在存储过程中编写事务处理代码的三种方法
  5. Linux 内存管理 | 地址映射:分段、分页、段页
  6. Linux 基础I/O :文件描述符,重定向,文件系统,软链接和硬链接,动态库和静态库
  7. 深入理解TCP实现|经典PDF分享
  8. Soul网关发布2.2.0 | 让高性能网关变得如此简单!
  9. GitHub被中国人霸榜!国外开发者不开心了
  10. 全域调度:云边协同在视频场景下的探索实践