当前位置:

首页 > 编程开发 > Java中Semaphore如何控制并发访问

Java中Semaphore如何控制并发访问

Semaphore是Java中用于控制并发线程数量的同步工具,通过许可机制实现限流与资源管理。1.它维护一组许可,线程需调用acquire()获取许可,无可用时阻塞;执行完任务后必须调用release()释放许可,防止资源泄露。2.可指定初始许可数,如newSemaphore(3)限制最多3个线程并发执行,适用于数据库连接池等场景。3.支持公平模式newSemaphore(3,true),按FIFO顺序分配许可,避免线程饥饿。4.提供tryAcquire()及超时版本,实现非阻塞或限时获取许可,满足高并发

Semaphore是Java中用于控制并发线程数量的同步工具,通过许可机制实现限流与资源管理。1. 它维护一组许可,线程需调用acquire()获取许可,无可用时阻塞;执行完任务后必须调用release()释放许可,防止资源泄露。2. 可指定初始许可数,如new Semaphore(3)限制最多3个线程并发执行,适用于数据库连接池等场景。3. 支持公平模式new Semaphore(3, true),按FIFO顺序分配许可,避免线程饥饿。4. 提供tryAcquire()及超时版本,实现非阻塞或限时获取许可,满足高并发下快速失败需求。示例中5个线程竞争3个许可,确保仅3个可同时运行,其余等待释放后进入,有效控制并发度,提升系统稳定性与资源利用率。

在Java中如何使用Semaphore控制并发线程访问_Semaphore并发控制技巧

在Java中,Semaphore 是一个用于控制同时访问特定资源的线程数量的同步工具。它通过维护一组许可(permits)来实现并发控制,适合用于限流、资源池管理等场景,比如数据库连接池、线程池中的任务调度限制等。

理解Semaphore的基本机制

Semaphore内部维护一定数量的许可。线程在执行前需要先获取许可,如果当前没有可用许可,线程将被阻塞,直到有其他线程释放许可。这使得我们能精确控制并发访问的线程数。

关键方法包括:

  • acquire():尝试获取一个许可,若无可用许可则阻塞。
  • acquire(int permits):获取指定数量的许可。
  • release():释放一个许可,使其他等待线程有机会获取。
  • tryAcquire():非阻塞方式尝试获取许可,立即返回true或false。

使用Semaphore限制并发线程数

假设我们希望最多允许3个线程同时访问某个资源,可以通过初始化Semaphore(3)来实现。

示例代码:

import java.util.concurrent.Semaphore;

public class SemaphoreExample {
    private static final Semaphore semaphore = new Semaphore(3); // 最多3个线程可同时运行

    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {
            new Thread(() -> {
                try {
                    System.out.println(Thread.currentThread().getName() + " 正在尝试获取许可...");
                    semaphore.acquire(); // 获取许可
                    System.out.println(Thread.currentThread().getName() + " 获得许可,开始执行任务");
                    
                    Thread.sleep(2000); // 模拟任务执行
                    
                    System.out.println(Thread.currentThread().getName() + " 任务完成,释放许可");
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                } finally {
                    semaphore.release(); // 释放许可
                }
            }, "Thread-" + i).start();
        }
    }
}

在这个例子中,尽管启动了5个线程,但最多只有3个能同时执行任务,其余线程会等待许可释放。

使用公平模式避免线程饥饿

Semaphore默认是非公平的,意味着等待的线程不保证按顺序获得许可。在对公平性要求较高的场景中,可以启用公平模式。

构造函数如下:

private static final Semaphore semaphore = new Semaphore(3, true); // 公平模式

开启公平模式后,Semaphore会按照FIFO顺序分配许可,减少线程长时间等待的问题。

结合tryAcquire实现超时或非阻塞控制

有时我们不希望线程无限等待,可以使用 tryAcquire() 或带超时的版本。

例如,限制线程最多等待1秒获取许可:

if (semaphore.tryAcquire(1, TimeUnit.SECONDS)) {
    try {
        // 执行任务
    } finally {
        semaphore.release();
    }
} else {
    System.out.println("获取许可超时,跳过执行");
}

这种方式适用于高并发系统中快速失败的设计原则,提升系统响应能力。

基本上就这些。合理使用Semaphore可以在不使用锁的情况下有效控制并发度,提升程序稳定性与资源利用率。注意及时调用release(),避免死锁或资源泄露。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发
相关文章 更多
会声会影多重修整视频:一次性剪辑多个片段的详细教程
会声会影多重修整视频:一次性剪辑多个片段的详细教程

面向需要从长视频中提取多个精彩片段的用户,利用会声会影的“多重修整视频”功能可避免反复切割素材的繁琐。本文详解如何在同一对话框内标记多段起止点,通过设置开始与结束标记批量生成独立片段,并介绍快速搜索定位技巧,帮助用户高效完成视频筛选与剪辑工作。

iPhone如何在AppStore下载立刻MV
iPhone如何在AppStore下载立刻MV

想在iPhone上使用立刻MV制作AI音乐视频?本指南详解如何在App Store准确搜索“立刻MV”,核对开发者ZhongManZhiSheng及iOS 17.0系统要求,完成安全下载与安装,并介绍首次启动后的核心功能入口。

会声会影剪辑教程:利用黄色标记快速截取视频片段
会声会影剪辑教程:利用黄色标记快速截取视频片段

面向使用会声会影进行基础视频编辑的用户,解决从长视频中精准截取所需片段的痛点。本文详细介绍利用时间轴上的黄色标记功能进行非破坏性剪辑的操作路径:包括将素材插入视频轨,通过拖动素材首尾端点设定起始与结束位置,从而快速分离出目标片段并预览效果。该方法操作直观,适合新手快速掌握视频裁剪技巧。

会声会影2023内嵌视频字幕怎么处理
会声会影2023内嵌视频字幕怎么处理

遇到会声会影2023中点不中的视频字幕?这通常是内嵌字幕。本文教你快速判断字幕类型,并在没有无字幕源文件时,使用裁剪、色块遮挡和模糊效果进行应急处理,避免画面出现难看的修补痕迹。

WPS 表格打开文件提示格式不兼容怎么处理
WPS 表格打开文件提示格式不兼容怎么处理

遇到WPS表格打开文件提示格式不兼容怎么办?本文教你通过保留副本、另存为转换、修复入口测试及特殊功能排查,安全处理xls/xlsx等格式差异,避免数据丢失。

Lovart中文版网页怎么登录及界面功能介绍
Lovart中文版网页怎么登录及界面功能介绍

新手如何登录Lovart中文版网页?本文详解账号授权步骤,拆解创意工作区、画布预览与对话输入三大核心模块,演示如何用自然语言生成图片及进行局部编辑,助你快速掌握AI设计工具的基础用法。

Windows10安装缺少驱动找不到硬盘解决方案
Windows10安装缺少驱动找不到硬盘解决方案

Windows 10安装时显示“找不到任何驱动器”或提示缺少驱动?本文详解如何通过BIOS确认硬盘状态、核对VMD/RAID存储模式,以及在安装界面正确加载厂商提供的存储控制器驱动(.inf),避免盲目切换设置导致原系统无法启动。

哔哩哔哩移动端怎么关闭自动连播
哔哩哔哩移动端怎么关闭自动连播

刷视频停不下来?教你在哔哩哔哩移动端快速找到并关闭自动连播功能,涵盖播放器控件、合集列表及全局设置入口,有效防止流量偷跑。

Windows10安装后网卡驱动缺失联网修复
Windows10安装后网卡驱动缺失联网修复

Windows 10重装后无法上网?本文详解如何通过设备管理器查看硬件ID,在另一台设备下载正确驱动,并按顺序安装芯片组、有线及无线网卡驱动,快速恢复网络连接。

二狗PPT怎么用模板快速制作PPT
二狗PPT怎么用模板快速制作PPT

想知道二狗PPT怎么用模板快速出稿?本教程详解从选模板、填内容到调整排版的完整流程,助你高效完成工作汇报与项目演示,避免常见排版误区。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
IntelliJ IDEA macOS版
IntelliJ IDEA macOS版
Mac

IntelliJ IDEA 是 JetBrains 推出的专业集成开发环境,重点服务于 Java、Kotlin 与 JVM 项目开发。软件集成代码补全、静态检查、重构、调试、测试、版本控制及构建工具,并可借助插件扩展语言和框架支持。

PyCharm macOS版
PyCharm macOS版
Mac

JetBrains PyCharm 是面向 Python 开发者的集成开发环境,提供智能补全、代码检查、重构、调试、测试、版本控制及虚拟环境管理功能。Mac 版兼容 Intel 与 Apple 芯片,核心功能可免费使用。

WebStorm macOS版
WebStorm macOS版
Mac

JetBrains WebStorm 是面向 JavaScript、TypeScript 和现代 Web 技术的专业集成开发环境,可智能理解项目结构,提供代码补全、重构、错误检查、运行调试、测试及 Git 工具。

WINDOWS 更多
IntelliJ IDEA Windows版
IntelliJ IDEA Windows版
Windows

JetBrains IntelliJ IDEA 是以 Java、Kotlin 和 JVM 项目为核心的专业集成开发环境,提供智能补全、代码检查、安全重构、调试、测试、版本控制及构建工具集成。统一发行版的核心功能可免费用于商业和非商业项目,

PhpStorm Windows版
PhpStorm Windows版
Windows

PhpStorm 是 JetBrains 面向 PHP 与现代 Web 开发打造的专业集成开发环境,提供代码补全、静态检查、重构、调试、测试、数据库、版本控制及前端语言支持。Windows 用户可直接下载安装程序,

PyCharm Windows版
PyCharm Windows版
Windows

PyCharm 是 JetBrains 推出的 Python 集成开发环境,提供智能代码补全、错误检查、重构、调试、测试、Git、终端及 Jupyter Notebook 支持。统一版安装后可体验 30 天 Pro 功能,