美文网首页
同步工具类之Semaphore

同步工具类之Semaphore

作者: evil_ice | 来源:发表于2017-01-09 22:28 被阅读9次
    一,计数信号量(Counting Semaphore)概述
    • 计数信号量(Counting Semaphore)用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量.计数信号量还可以用来实现某种资源池,或者对容器施加边界
    • Semaphore中管理着一组虚拟的许可(Permit),许可的初始数量可通过构造函数来指定.在执行操作时可以首先获得许可(只要还有剩余的许可),并在使用以后释放许可.如果没有许可,那么acquire将阻塞直到有许可(或者直到被中断或者操作超时).release方法将返回一个许可信号量.
    • 计数信号量的一种简化形式是二值信号量,即初始值为1的Semaphore,二值信号量可以用做互斥体(mutex),并具备不可重入的加锁语义:谁拥有这个唯一许可,谁就拥有了互斥锁
    • 可以使用Semaphore将任何一种容器编程有界阻塞容器
    二,利用Semaphore实现一个有界阻塞容器示例

    信号量的计数值会初始化为容器容量的最大值.add操作在向底层容器中添加一个元素之前,首先要获取一个许可.如果add操作没有添加任何元素,那么会立刻释放许可.同样,remove操作释放一个许可,使更多的元素能够添加到容器中.

    class BoundedHashSet<T> {
        private final Set<T> set;
        private final Semaphore sem;
    
        public BoundedHashSet(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;
        }
    }
    
    

    参考:
    <<java编发编程实战>>

    相关文章

      网友评论

          本文标题:同步工具类之Semaphore

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