首页 > 代码库 > Java_信号量_Semaphore应用
Java_信号量_Semaphore应用
Java_信号量_Semaphore应用
计数信号量(Counting Semaphore)用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量。计数信号量还可以用来实现某种资源池,或者对容器施加边界。
Semaphore中管理着一组虚拟的许可(permit),许可的初始数量可通过构造函数来指定。在执行操作时,可以首先获得许可(只要还有剩余的许可),并在使用以后释放许可。
如果没有许可,那么acquire将阻塞直到有许可(或者直到被中断或者操作超时)。release方法将返回一个许可给信号量。计算信号量的一种简化形式是二值信号量,即初始值为1
的Semaphore。二值信号量可以用来做互斥体,并具备不可重入的加锁语义:谁拥有这个唯一的许可,谁就拥有了互斥锁。
示例代码:
package com.lyx; import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.concurrent.Semaphore; public class BoundHashSet<T> { private final Set<T> set; private final Semaphore semaphore; public BoundHashSet(int bound) { this.set = Collections.synchronizedSet(new HashSet<T>()); this.semaphore = new Semaphore(bound); } public boolean add(T o) throws InterruptedException { this.semaphore.acquire(); boolean wasAdded = false; try { wasAdded = this.set.add(o); return wasAdded; } finally { if (!wasAdded) { this.semaphore.release(); } } } public boolean remove(Object o) { boolean wasRemoved = this.set.remove(o); if (wasRemoved) { this.semaphore.release(); } return wasRemoved; } }
======================END======================
Java_信号量_Semaphore应用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。