参考书籍:《Java并发编程实战》
一般来说,我们所用的Java容器都是无界的,也就是可以无限制的往容器里添加元素。那么如何定义一个限制元素个数的容器呢?并且超过容器上限时,阻塞添加操作,删除元素后恢复添加操作。
Semaphore可以很好的解决该问题,可以当做一个有次数的锁,acquire后需要release才不减少次数,只是acquire的话,锁次数会一直减少。
因为涉及到并发,容器也需要同步Collections.synchronized...
。
以set为例,代码如下:
public class BoundedHashSet<E> {
private final Set<E> set;
private final Semaphore sem;
public BoundedHashSet(int bound) {
this.set = Collections.synchronizedSet(new HashSet<>());
this.sem = new Semaphore(bound);
}
public boolean add(E e) throws InterruptedException {
sem.acquire();
boolean added = false;
try {
added = set.add(e);
} finally {
if (!added) {
sem.release();
}
}
return added;
}
public boolean remove(E e) {
boolean removed = set.remove(e);
if (removed) {
sem.release();
}
return removed;
}
}
网友评论