当前位置:首页 > Java > 正文

Java Semaphore详解(小白也能学会的信号量与多线程同步控制)

在Java并发编程中,Java Semaphore(信号量)是一个非常实用的同步工具类,用于控制多个线程对共享资源的访问数量。本教程将从零开始,带你深入理解信号量教程的核心概念、使用方法以及典型应用场景,即使是初学者也能轻松掌握。

Java Semaphore详解(小白也能学会的信号量与多线程同步控制) Semaphore 信号量教程 多线程同步 Java并发控制 第1张

什么是Semaphore?

Semaphore 是 Java.util.concurrent 包中的一个计数信号量。它维护了一组“许可证”(permits)。每当一个线程想要访问受保护的资源时,它必须先获取一个许可证;使用完资源后,再释放该许可证。如果当前没有可用许可证,线程将被阻塞,直到有其他线程释放许可证。

Semaphore 的基本用法

创建一个 Semaphore 对象非常简单:

Semaphore semaphore = new Semaphore(int permits);  

其中 permits 表示初始可用的许可证数量。

常用方法

  • acquire():获取一个许可证,如果没有可用许可证则阻塞等待。
  • release():释放一个许可证,唤醒等待的线程。
  • tryAcquire():尝试获取许可证,若不可用则立即返回 false,不阻塞。

实战示例:模拟停车场

假设一个停车场只有3个车位,最多允许3辆车同时停入。我们可以用 Java并发控制 中的 Semaphore 来实现这个逻辑:

import java.util.concurrent.Semaphore;public class ParkingExample {    private static final int PARKING_SPOTS = 3;    private static Semaphore parking = new Semaphore(PARKING_SPOTS);    public static void main(String[] args) {        for (int i = 1; i <= 6; i++) {            new Thread(new Car(i)).start();        }    }    static class Car implements Runnable {        private int carId;        Car(int id) {            this.carId = id;        }        @Override        public void run() {            try {                System.out.println("汽车 " + carId + " 正在等待停车位...");                parking.acquire(); // 获取一个车位                System.out.println("汽车 " + carId + " 停入车位!");                Thread.sleep(2000); // 模拟停车2秒                System.out.println("汽车 " + carId + " 离开车位。");            } catch (InterruptedException e) {                Thread.currentThread().interrupt();            } finally {                parking.release(); // 释放车位            }        }    }}  

运行结果会显示:最多只有3辆车能同时停入,其余车辆需等待。这正是 多线程同步 的典型体现。

注意事项

  • Semaphore 不是可重入的,即同一个线程多次调用 acquire() 会消耗多个许可证。
  • 务必在 finally 块中调用 release(),防止因异常导致许可证未释放,造成死锁。
  • 可以使用 tryAcquire(timeout, unit) 设置超时时间,避免无限等待。

总结

通过本篇 Java Semaphore 教程,你已经掌握了信号量的基本原理、核心方法和实际应用。无论是限制数据库连接池大小、控制并发下载线程数,还是模拟资源池场景,Semaphore 都是非常强大的工具。希望这篇 信号量教程 能帮助你在 Java并发控制多线程同步 的道路上更进一步!