Java信号量_Semaphore
Java信号量_Semaphore
秋风醉了 发表于3年前
Java信号量_Semaphore
  • 发表于 3年前
  • 阅读 150
  • 收藏 7
  • 点赞 0
  • 评论 1
摘要: 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=============

共有 人打赏支持
粉丝 215
博文 608
码字总数 434545
评论 (1)
×
秋风醉了
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: