并发编程之Semaphore信号量

简介: `Semaphore` 翻译过来就是信号量, 其根本原理就是基于 `CAS` 共享锁的一种实现。举一个例子。假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开两辆,则又可以放入两辆,如此往复。

作者: 西魏陶渊明
博客: https://blog.springlearn.cn/

🚀 知识快读

Semaphore 翻译过来就是信号量, 其根本原理就是基于 CAS 共享锁的一种实现。举一个例子。
假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开两辆,则又可以放入两辆,如此往复。

那么上面的这个例子可以这样理解,资源一共有3个, 即三个车位。如何来控制这5辆汽车,来合理的使用这3个资源呢?
Semaphore 可以这样来定义。

// 1. 定一个信号量,声明有3个资源。使用公平模式线程将会按到达的顺序(FIFO)执行(也就是等待时间最长的先执行),如果是非公平,则可以后请求的有可能排在队列的头部。
Semaphore semp = new Semaphore(3);
// 2. 获取1个许可 - 最大允许3个进入,一但超过就让其等待,除非已经释放
semp.acquire();  
// 3. 释放1个许可 
semp.release(); 
// 4. 获取1许可,失败就返回,不等待
semp.tryAcquire();  
// 5. 获取2许可,失败就返回,不等待
semp.tryAcquire(2);  
// 6. 不允许被中断
semp.acquireUninterruptibly();

知识点1: Fair & NoFair

Semaphore 的模式配置,只是构造来定义。

  • 默认构造不公平模式, 谁来申请资源,就先尝试获取资源。排队的要等到没有资源进来申请才能继续申请
    public Semaphore(int permits) {
        sync = new NonfairSync(permits);
    }

    public Semaphore(int permits, boolean fair) {
        sync = fair ? new FairSync(permits) : new NonfairSync(permits);
    }

知识点2: 申请资源

  • acquire() 获取1个资源,获取不到就等待,如果线程中断,会直接中断。
  • acquire(2) 获取2个资源,获取不到就等待,如果线程中断,会直接中断。
  • tryAcquire() 获取1个资源,获取不到就返回 false,如果线程中断,会直接中断。
  • acquireUninterruptibly() 获取1个资源,获取不到就等待,不会关心线程中断。

知识点3: 释放资源

  • release() 释放一个资源
  • release(2) 释放两个资源

知识点4: 其他API

  • availablePermits() 当前资源数量
  • drainPermits() 获取当前资源数量,并将剩余资源清零,直接赋值0
  • reducePermits(2) 将资源数量,扣减2个
  • isFair() 是否公平
  • hasQueuedThreads() 是否还有线程等待
  • getQueueLength() 还有多少线程等待
  • getQueuedThreads() 获取所有的线程集合
相关文章
|
2月前
|
Java
JAVA并发编程系列(7)Semaphore信号量剖析
腾讯T2面试,要求在3分钟内用不超过20行代码模拟地铁安检进站过程。题目设定10个安检口,100人排队,每人安检需5秒。实际中,这种题目主要考察并发编程能力,特别是多个线程如何共享有限资源。今天我们使用信号量(Semaphore)实现,限制同时进站的人数,并通过信号量控制排队和进站流程。并详细剖析信号量核心原理和源码。
|
6月前
|
Java 数据库
Semaphore(信号量)源码解读与使用
Semaphore(信号量)源码解读与使用
|
6月前
多线程并发之Semaphore(信号量)使用详解
多线程并发之Semaphore(信号量)使用详解
1971 0
|
Java
Java多线程:Semaphore
Java多线程:Semaphore
114 0
|
Java 数据库连接 API
【JUC】信号量Semaphore详解
【JUC】信号量Semaphore详解
171 0
【JUC】信号量Semaphore详解
Semaphore 信号量源码分析
Semaphore 信号量源码分析
Semaphore 信号量源码分析
|
Java 数据库连接 数据库
Java并发编程 - AQS 之 Semaphore(二)
Java并发编程 - AQS 之 Semaphore(二)
111 0
Java并发编程 - AQS 之 Semaphore(二)
|
Java
Java并发编程 - AQS 之 Semaphore(一)(上)
Java并发编程 - AQS 之 Semaphore(一)(上)
138 0
Java并发编程 - AQS 之 Semaphore(一)(上)
|
Java
Java并发编程之Semaphore信号量
Java并发编程之Semaphore信号量
151 0
Java并发编程之Semaphore信号量
Semaphore信号量
Semaphore 可以用来限制或管理数量有限资源的使用情况 - 信号量的作用是用来维护一个“许可证”,的计数,线程可以获取 许可证,那信号量剩余许可证就减一,线程也可以是否一个许可证,那剩余的许可证就加一,当信号量拥有的许可证为0时,那么下一个线程想获得许可证,就要进行等待,直到另外线程释放许可证
276 0
Semaphore信号量