Semaphore(信号量)
信号量(Semaphore)是一种用于控制多个线程对共享资源访问的同步机制。它实质上是一个计数器,可以用来限制能够访问某些资源的线程数量。信号量可以是二进制的(只允许一个线程访问)或计数的(允许多个线程访问,具体数目由信号量的值决定)。
信号量产生的原因
信号量最初是由荷兰计算机科学家Edsger Dijkstra在1965年提出的。在多线程编程中,线程之间的同步是一个关键问题,尤其是在共享资源的访问控制上。传统的锁机制(如互斥锁mutex)虽然可以解决资源的互斥访问问题,但它们并不适用于所有场景,尤其是当需要控制多个线程对资源的并发访问数量时,信号量就显得尤为重要。
使用场景
-
限流器:例如,一个系统可能有固定的数据库连接数,使用信号量可以控制并发访问数据库的线程数量,避免过多的连接请求导致性能下降或资源耗尽。
-
资源共享:当多个线程需要访问有限的共享资源时,如打印机、网络连接等,信号量可以用来控制同时访问资源的线程数量。
-
线程池管理:在创建线程池时,信号量可以用来控制活动线程的数量,避免无限制地创建新线程。
如何使用
在Java中,java.util.concurrent
包下的Semaphore
类提供了信号量的实现。以下是一个使用Semaphore
的例子,它演示了如何控制同时访问共享资源的线程数量。
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
public class SemaphoreExample {
private static final int RESOURCE_LIMIT = 5; // 共享资源的限制数量
private static final Semaphore semaphore = new Semaphore(RESOURCE_LIMIT);
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(new ResourceConsumer(semaphore)).start();
}
}
static class ResourceConsumer implements Runnable {
private final Semaphore semaphore;
public ResourceConsumer(Semaphore semaphore) {
this.semaphore = semaphore;
}
@Override
public void run() {
try {
// 请求一个许可
semaphore.acquire();
System.out.println("线程 " + Thread.currentThread().getName() + " 开始访问资源");
// 模拟资源访问
TimeUnit.SECONDS.sleep(2);
System.out.println("线程 " + Thread.currentThread().getName() + " 结束访问资源");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
// 释放一个许可
semaphore.release();
}
}
}
}
在这个例子中创建了一个限制为5的信号量,意味着最多有5个线程可以同时访问共享资源。当第6个线程尝试访问资源时,它会被阻塞,直到有其他线程释放了信号量。这样,我们可以确保系统资源不会被过度消耗,同时也保持了程序的稳定性和效率。
标签:场景,Java,semaphore,信号量,访问,线程,Semaphore,资源 From: https://blog.csdn.net/kiingking/article/details/140146333