详解Java信号量-Semaphore

第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中的代码。每个线程在开始执行前

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值