第1章:引言
大家好,我是小黑。今天,咱们一起来深入探讨一下Semaphore。在Java中,正确地管理并发是一件既挑战又有趣的事情。当谈到并发控制,大家可能首先想到的是synchronized关键字或者是ReentrantLock。但其实,Java还提供了一个非常强大的工具,就是Semaphore。
Semaphore,直译过来就是“信号量”。在日常生活中,信号灯控制着车辆的通行,防止交通混乱,这其实和Semaphore在程序中的作用颇为相似。Semaphore主要用于控制同时访问特定资源的线程数量,它通过协调各个线程,保证合理的使用公共资源。比方说如果有一家餐馆只允许固定数量的顾客同时用餐,这就是Semaphore的经典应用场景。
第2章:Semaphore的基本概念
让我们先来了解一下Semaphore的基本概念。在Java中,Semaphore是位于java.util.concurrent
包下的一个类。它的核心就是维护了一个许可集。简单来说,就是有一定数量的许可,线程需要先获取到许可,才能执行,执行完毕后再释放许可。
那么,这个许可是什么呢?其实,你可以把它想象成是对资源的访问权。比如,有5个许可,就意味着最多允许5个线程同时执行。线程可以通过acquire()
方法来获取许可,如果没有可用的许可,该线程就会阻塞,直到有许可可用。
让我们看个简单的例子。假设咱们有一个限制了最多同时3个线程执行的Semaphore:
java
复制代码
import java.util.concurrent.Semaphore; public class SemaphoreExample { // 创建一个Semaphore实例,许可数量为3 private static final Semaphore semaphore = new Semaphore(3); public static void main(String[] args) { // 创建并启动三个线程 for (int i = 1; i <= 3; i++) { new Thread(new Task(semaphore), "线程" + i).start(); } } static class Task implements Runnable { private final Semaphore semaphore; public Task(Semaphore semaphore) { this.semaphore = semaphore; } @Override public void run() { try { // 请求许可 semaphore.acquire(); System.out.println(Thread.currentThread().getName() + " 获取许可,正在执行"); Thread.sleep(1000); // 模拟任务执行 System.out.println(Thread.currentThread().getName() + " 执行完毕,释放许可"); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { // 释放许可 semaphore.release(); } } } }
在这个例子中,咱们创建了一个Semaphore实例,设置最大许可数为3。这意味着,最多只能有3个线程同时运行Task中的代码。每个线程在开始执行前