美文网首页
使用Semaphore定义有界阻塞容器

使用Semaphore定义有界阻塞容器

作者: 纳米君 | 来源:发表于2018-09-02 23:55 被阅读16次

参考书籍:《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;
    }
}

相关文章

网友评论

      本文标题:使用Semaphore定义有界阻塞容器

      本文链接:https://www.haomeiwen.com/subject/geqmwftx.html