Semaphore 原理简介和使用(上)

简介: Semaphore 原理简介和使用(上)

Semaphore实现共享锁


简介


在多线程环境下用于协调各个线程, 以保证它们能够正确、合理的使用公共资源
信号量维护了一个许可集,我们在初始化Semaphore时需要为这个许可集传入一个数量值,
该数量值代表同一时间能访问共享资源的线程数量。
线程可以通过acquire()方法获取到一个许可,然后对共享资源进行操作,
如果许可集已分配完了,那么线程将进入等待状态,
直到其他线程释放许可才有机会再获取许可,线程释放一个许可通过release()方法完成


DEMO了解其用法


image.png


Semaphore实现互斥锁


简介


在初始化信号量时传入1,使得它在使用时最多只有一个可用的许可,从而可用作一个相互排斥的锁。
这通常也称为二进制信号量,因为它只能有两种状态:一个可用的许可或零个可用的许可。
按此方式使用时,二进制信号量具有某种属性(与很多 Lock 实现不同),即可以由线程释放“锁”,而不是由所有者(因为信号量没有所有权的概念)


DEMO了解其用法


image.png


Semaphore提供的方法


  • Semaphore(int permits) 创建具有给定的许可数和非公平的公平设置的Semaphore
  • Semaphore(int permits, boolean fair) 创建具有给定的许可数和给定的公平设置的Semaphore,true即为公平锁
  • void acquireUninterruptibly()  从此信号量中获取许可,不可中断
  • int availablePermits()  返回此信号量中当前可用的许可数
  • int drainPermits()  获取并返回立即可用的所有许可
  • protected  Collection<Thread> getQueuedThreads() 返回一个 collection,包含可能等待获取的线程
  • int getQueueLength() 返回正在等待获取的线程的估计数目
  • boolean hasQueuedThreads() 查询是否有线程正在等待获取
  • boolean isFair() 如果此信号量的公平设置为 true,则返回 true
  • boolean tryAcquire()  仅在调用时此信号量存在一个可用许可,才从信号量获取许可
  • boolean tryAcquire(long timeout, TimeUnit unit)  如果在给定的等待时间内,此信号量有可用的许可并且当前线程未被中断,则从此信号量获取一个许可


内部原理分析


类图


image.png


image.png


相关文章
|
3月前
Semaphore原理
文章概述了Semaphore的工作原理及其使用场景:Semaphore是一种有效的限流工具,可以用来控制同一时刻访问共享资源的线程数量。它适用于需要对资源访问进行限流的场景,以避免资源过载或实现公平的资源分配。
Semaphore原理
|
6月前
|
算法 Java 调度
Semaphore实现原理全面解析
Semaphore(信号量)是一个同步工具类,通过Semaphore可以控制同时访问共享资源的线程个数。
|
6月前
学习多线程之Semaphore工具解释
学习多线程之Semaphore工具解释
65 0
Semaphore使用及原理解读
Semaphore使用及原理解读
Semaphore使用及原理解读
|
Java 测试技术
Semaphore原理剖析
Semaphore原理剖析
146 0
|
Java API Spring
java并发原理实战(4) -- 线程的创建方式
java并发原理实战(4) -- 线程的创建方式
122 0
java并发原理实战(4) -- 线程的创建方式
Semaphore 原理简介和使用(下)
Semaphore 原理简介和使用(下)
105 0
Semaphore 原理简介和使用(下)
|
安全
AQS原理简介(下)
AQS原理简介(下)
128 0
AQS原理简介(下)
CountDownLatch原理简介和使用过程(1)
CountDownLatch原理简介和使用过程(1)
179 0
CountDownLatch原理简介和使用过程(1)