Java并发编程--JUC并发工具类之Semaphore
摘要
-
本文介绍Semaphore相关技术
-
本文基于
jdk1.8
Semaphore介绍
-
Semaphore
(信号量)是一种用于多线程编程的同步工具,用于控制同时访问某个资源的线程数量。 -
Semaphore
维护了一个计数器,线程可以通过调用acquire()
方法来获取Semaphore
中的许可证,当计数器为0
时,调用acquire()
的线程将被阻塞,直到有其他线程释放许可证; -
线程可以通过调用
release()
方法来释放Semaphore
中的许可证,这会使Semaphore
中的计数器增加,从而允许更多的线程访问共享资源。
Semaphore常用方法
方法 | 描述 |
---|---|
Semaphore(int permits) |
构造函数,创建具有给定许可数的Semaphore对象 |
Semaphore(int permits,boolean fair) |
构造函数,创建具有给定许可数的Semaphore对象,fair 表示公平性,如果这个设为 true 的话,下次执行的线程会是等待最久的线程 |
int availablePermits() |
返回当前可用的许可数 |
void acquire() |
获取一个许可,如果没有可用的许可,则阻塞直到有可用的许可 |
void release() |
释放一个许可 |
boolean tryAcquire() |
尝试获取一个许可,如果有可用的许可,则获取成功,返回true;否则返回false |
Semaphore代码示例
-
在这个示例中,Semaphore的初始许可数为2,意味着最多允许两个线程同时访问共享资源。
-
每个工作线程在执行工作前都会请求一个许可,如果许可可用,它将获得许可并执行工作,然后释放许可供其他线程使用。
-
如果没有可用的许可,线程将被阻塞直到有可用的许可为止。通过Semaphore的控制,最多允许两个线程并发执行,而第三个线程需要等待前面的线程释放许可后才能执行。
1 | import java.util.concurrent.Semaphore; |
Semaphore应用场景
-
限流:
Semaphore
可以用于限制对共享资源的并发访问数量,以控制系统的流量。 -
资源池:
Semaphore
可以用于实现资源池,以维护一组有限的共享资源