美文网首页
Java 信号量详解

Java 信号量详解

作者: 爱跳的老鼠君 | 来源:发表于2020-10-03 20:30 被阅读0次

java 计数信号量用来控制访问某个特定资源的操作数量,或者同时执行某个指定操作的数量,还可以用来实现某种资源池,或者对容器施加边界。
Semaphore中管理着一组虚拟的permits, 初始数量可以通过构造函数来指定, 在执行操作的时候首先要获得许可, 并在使用之后释放许可。如果没有许可, 那么acquire将阻塞直到有许可, 或者被中断或者操作超时。release方法会释放一个许可给Semaphore。
Semaphore有两种构造函数,一个是Semaphore(int permits), 通过这个构造函数生成的Semaphore不能保证获取permits的先后顺序, 意味着可能一个新的thread 会比一个等待了一段时间的另外一个thread先获得许可。第二个构造函数是Semaphore(int permits, boolean fair), 你可以通过制定fair是true来让threads 有序的获取permits。

Semaphore 的同步的实现是通过AQS来保证的, 如果有对AQS还不是很了解的同学可自行google 学习。 Semaphore 是共享的同步机制, 因此实现了两个AQS的两个方法,tryAcquireShared和tryReleaseShared。
'''
protected int tryAcquireShared(int acquires) {
for (;;) {
if (hasQueuedPredecessors())
return -1;
int available = getState();
int remaining = available - acquires;
if (remaining < 0 ||
compareAndSetState(available, remaining))
return remaining;
}
}
'''
'''
protected int tryAcquireShared(int acquires) {
for (;;) {
if (hasQueuedPredecessors())
return -1;
int available = getState();
int remaining = available - acquires;
if (remaining < 0 ||
compareAndSetState(available, remaining))
return remaining;
}
}
'''

Semaphore 还可以用来将任何一种容器变成有界的阻塞容器, 如下面的BoundedHashSet
'''
public class BoundedHashSet<T> {
private final Set<T> set;
private final Semaphore semaphore;

public BoundedHashSet(int bound) {
    this.set = Collections.synchronizedSet(new HashSet<>());
    this.semaphore = new Semaphore(bound);
}

public boolean add(T t) throws InterruptedException{
    semaphore.acquire();
    boolean wasAdded = false;
    try{
        wasAdded = set.add(t);
        return wasAdded;
    }
    finally {
        if (!wasAdded){
            semaphore.release();
        }
    }
}

public boolean remove(T t){
    boolean wasRemoved = set.remove(t);
    if(wasRemoved){
        semaphore.release();
    }
    return wasRemoved;
}

}
'''

相关文章

  • Java 信号量详解

    java 计数信号量用来控制访问某个特定资源的操作数量,或者同时执行某个指定操作的数量,还可以用来实现某种资源池,...

  • Java信号量Semaphore详解

    作者: 一字马胡 转载标志 【2017-11-03】 更新日志 导入 Semaphore实现为一种基于计数的信号...

  • FreeMarker | 笔记篇

    java中Freemarker list指令详解 java中Freemarker if else指令详解 java...

  • java concurrency <信号量>

    java concurrency <信号量> 使用信号量的目的 线程信号量的目的是使线程能够彼此发送信号。 此外,...

  • 高并发编程-13-加点小菜-信号量

    1,什么是信号量 java.util.concurrent.Semaphore信号量是一个计数信号量。这就意味着使...

  • Java 反射机制

    [1]. java反射详解[2]. Java Reflection(反射机制)详解[3]. 深入理解Java类型...

  • Java注解

    Java注解(Annotation)详解(一)——概述及JDK自带注解 Java注解(Annotation)详解(...

  • Java并发编程之Semaphore的使用

    1. 总览 在这个快速教程中,我们将会探索Java中信号量和互斥锁的基础知识。 2. 信号量 我们将从java.u...

  • 回归Java基础,详解 Java 内部类

    回归Java基础,详解 Java 内部类

  • Java 动态代理

    java的动态代理机制详解 JDK动态代理详解 Java核心技术点之动态代理

网友评论

      本文标题:Java 信号量详解

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