📅  最后修改于: 2023-12-03 15:31:35.128000             🧑  作者: Mango
Java.util.concurrent.Semaphore是Java提供的一个多线程并发控制类。Semaphore旨在限制同时访问共享资源的线程数,以便在并发环境中实现同步。Semaphore还可以用作获取有限数量资源的许可机制。
Semaphore是一个线程同步工具,常常被用于限制并发线程数的访问。Semaphore的本质是一个计数器,他可以控制同时访问的线程的数量。Semaphore包括两个主要操作:acquire和release。
acquire方法:当一个线程调用acquire方法时,Semaphore会将计数器减一,如果当前计数器的值为0,那么这个线程会被阻塞,直到有另一个线程调用了release方法,将计数器的值加一,此时被阻塞的线程才能继续执行。
release方法:当有一个线程调用release方法时,Semaphore会将计数器的值加1,此时如果有线程在等待该Semaphore的许可,它将被唤醒,继续执行。
Semaphore的最大作用就是用来控制并发线程的数量。比如,有一些资源(如数据库连接池)在同一时间只能被有限个线程访问,此时可以使用Semaphore来维护这个访问上限。
Semaphore还可以用作一种“开关”,当需要一定条件组满足时才能继续执行时,可以使用Semaphore来达到此目的。
下面给出一个简单的例子,使用Semaphore控制并发访问线程的数量。
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
// 创建Semaphore实例,限制同时执行的线程数量为5
private static final Semaphore semaphore = new Semaphore(5);
public static void main(String[] args) {
// 创建20个线程执行任务
for (int i = 0; i < 20; i++) {
new Thread(new Task()).start();
}
}
static class Task implements Runnable {
@Override
public void run() {
try {
// 获取Semaphore的许可
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + ": acquire semaphore permit.");
// 模拟耗时的任务操作
Thread.sleep(1000);
// 释放Semaphore的许可
semaphore.release();
System.out.println(Thread.currentThread().getName() + ": release semaphore permit.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
上面例子创建了20个线程,这些线程会执行相同的任务。当每个线程获取到Semaphore的许可时,即打印“acquire semaphore permit.”,当完成任务并释放Semaphore的许可时,即打印“release semaphore permit.”。由于Semaphore的限制,同时执行的线程数量在5以内。
在多线程并发应用中,Semaphore是一种常用的控制并发线程数量的工具。Semaphore可以限制同时访问共享资源的线程数,也可以用作获取有限数量资源的许可机制,通过acquire和release方法来控制访问线程的数量。Semaphore的实现可以帮助我们实现多线程的协作和同步,从而编写出更高效和更完善的多线程应用。