Java Semaphore使用

Java中Semaphore(信号量)的使用 Semaphore的作用:在java中,使用了synchronized关键字和Lock锁实现了资源的并发访问控制,在同一时间只允许唯一了线程进入临界区访问资源(读锁除外),这样子控制的主要目的是为了解决多个线程并发同一资源造成的数据不一致的问题。在另外一种场景下,一个资源有多个副本可供同时使用,比如打印机房有多个打印机、厕所有多个坑可供同时使用,这种情况下,Java提供了另外的并发访问控制--资源 阅读详情

使用

Semaphore:信号量,用于控制多个线程访问资源 void acquire() throws InterruptedException
尝试获取一个准入的许可。如果无法获得,则线程等待,直到获取许可或者当前线程被中断


​​​​​void acquireUninterruptibly() 尝试获取一个准入的标准。如果无法获得,则线程等待,不能呗线程中断。

boolean tryAcquire 尝试获取一个许可,如果成功获取则返回true,否则返回false,它不会进行等待,立即返回 boolean

tryAcquire(long timeout, TimeUnit unit) 尝试获取一个许可,直到成功获取或等待了指定的最长时间 void release() 释放许可

 

Demo

public class SemaphoreTest  implements Runnable {
    final Semaphore semaphore = new Semaphore(5);  //指定同时访问某一资源的线程数量

    @Override
    public void run() {
        try {
            semaphore.acquire();
            System.out.println(Thread.currentThread().getName() + " acquire,currentTime:"+getCurrentDateTime());
            Thread.sleep(2000);
            System.out.println(Thread.currentThread().getName() +" done!currentTime:"+getCurrentDateTime() );
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            semaphore.release();  //释放
        }
    }


    private String getCurrentDateTime() {
        DateFormat fdt = DateFormat.getDateTimeInstance();
        return fdt.format(new Date());
    }


    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(20);
        SemaphoreTest st = new SemaphoreTest();
        for ( int i = 0 ; i < 20 ; i++){
            executor.submit(st);
        }
    }
}

 

结果:

pool-1-thread-4 acquire,currentTime:2020-5-15 18:25:38
pool-1-thread-3 acquire,currentTime:2020-5-15 18:25:38
pool-1-thread-1 acquire,currentTime:2020-5-15 18:25:38
pool-1-thread-2 acquire,currentTime:2020-5-15 18:25:38
pool-1-thread-5 acquire,currentTime:2020-5-15 18:25:38
pool-1-thread-2 done!currentTime:2020-5-15 18:25:40
pool-1-thread-1 done!currentTime:2020-5-15 18:25:40
pool-1-thread-4 done!currentTime:2020-5-15 18:25:40
pool-1-thread-5 done!currentTime:2020-5-15 18:25:40
pool-1-thread-3 done!currentTime:2020-5-15 18:25:40
pool-1-thread-8 acquire,currentTime:2020-5-15 18:25:40
pool-1-thread-7 acquire,currentTime:2020-5-15 18:25:40
pool-1-thread-9 acquire,currentTime:2020-5-15 18:25:40
pool-1-thread-10 acquire,currentTime:2020-5-15 18:25:40
pool-1-thread-6 acquire,currentTime:2020-5-15 18:25:40
pool-1-thread-6 done!currentTime:2020-5-15 18:25:42
pool-1-thread-10 done!currentTime:2020-5-15 18:25:42
pool-1-thread-9 done!currentTime:2020-5-15 18:25:42
pool-1-thread-7 done!currentTime:2020-5-15 18:25:42
pool-1-thread-8 done!currentTime:2020-5-15 18:25:42
pool-1-thread-11 acquire,currentTime:2020-5-15 18:25:42
pool-1-thread-12 acquire,currentTime:2020-5-15 18:25:42
pool-1-thread-14 acquire,currentTime:2020-5-15 18:25:42
pool-1-thread-13 acquire,currentTime:2020-5-15 18:25:42
pool-1-thread-16 acquire,currentTime:2020-5-15 18:25:42
pool-1-thread-11 done!currentTime:2020-5-15 18:25:44
pool-1-thread-14 done!currentTime:2020-5-15 18:25:44
pool-1-thread-12 done!currentTime:2020-5-15 18:25:44
pool-1-thread-16 done!currentTime:2020-5-15 18:25:44
pool-1-thread-13 done!currentTime:2020-5-15 18:25:44
pool-1-thread-17 acquire,currentTime:2020-5-15 18:25:44
pool-1-thread-18 acquire,currentTime:2020-5-15 18:25:44
pool-1-thread-15 acquire,currentTime:2020-5-15 18:25:44
pool-1-thread-19 acquire,currentTime:2020-5-15 18:25:44
pool-1-thread-20 acquire,currentTime:2020-5-15 18:25:44
pool-1-thread-15 done!currentTime:2020-5-15 18:25:46
pool-1-thread-18 done!currentTime:2020-5-15 18:25:46
pool-1-thread-17 done!currentTime:2020-5-15 18:25:46
pool-1-thread-19 done!currentTime:2020-5-15 18:25:46
pool-1-thread-20 done!currentTime:2020-5-15 18:25:46

Python+Selenium实战:5分钟搞定快手评论区数据采集(附完整代码) 本文详细介绍了如何使用Python和Selenium快速采集快手评论区数据,提供完整的代码实现和优化方案。通过动态加载处理和智能等待策略,5分钟内即可构建高效的评论采集工具,适用于用户行为分析和内容挖掘等场景。 阅读详情

相关推荐

产品经理必看!用Cursor自动生成符合开发规范的技术文档(含UI设计规则模板)

本文详细介绍了产品经理如何利用Cursor工具自动生成符合开发规范的技术文档,并整合UI设计规则模板。通过配置标准化文档结构和设计关联规则,Cursor能有效解决术语不统一、结构混乱等问题,提升跨团队协作效率。文章包含实际案例、规则配置要点及企业级实施方案,帮助产品经理快速掌握AI辅助文档生成技巧。

emacs5lisp的博客 225

java中Semaphore的用法

Semaphore。

m0_61366135的博客 527

Dify视觉模型节点避坑指南:我用Qwen2.5-VL做OCR识别时踩过的3个坑(及解决方案)

本文分享了使用Dify平台和Qwen2.5-VL视觉模型进行OCR票据识别时遇到的三个常见问题及解决方案,包括文件变量传递、结构化输出和条件分支判断失效。通过实战经验,帮助开发者优化多模态模型在财务自动化中的应用,提升OCR识别精度和效率。

weixin_29284885的博客 407

JAVA基础——Semaphore的用法

semaphore的中文翻译是信号灯。 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。 把它比作是控制流量的红绿灯,比如XX马路要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须在路口等待,所以前一百辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶入XX马路,但是如果前一百辆中有五辆车已经离开了XX马路,那么后面就允许有5辆车驶入马路,这个例子里说的车就是线程,驶入马路就表示线程在执行,离开马路就表示线程执行完成,.

momo牛的博客 525

关于华为高斯数据库出现Invalid or unsupported by client SCRAM mechanisms定位解决的过程

最近公司有个新项目使用的是高斯数据库,因为我们的项目是直接从别的项目组拿来的,配置都是已经配好的,但是在放到正式环境上之后出现报错。起初我们以为是测试和正式的版本不一致,但是结果是版本一致的。最后这个问题搞了我们几个小时,都没法解决。

Curtisjia的博客 3188

iPhone免越狱Git服务器搭建教程-iSH

iPhone免越狱Git服务器搭建教程

jts666的博客 4430

Semaphore的概念及基本用法

Semaphore这个英文单词的意思是信号灯,即发送信号的那种灯。Java并发工具包中的Semaphore类则是线程之间互相发送信号的工具。我们可以把Semaphore看作一个包含多个许可(permit)的集合,例如一个代表5个许可的Semaphore、6个许可的Semaphore等等(为便于表达,后文用字母P表示许可)。Semaphore上的acuqire操作申请P,而release操作则产生P,Semaphore可用于追踪可用资源的个数。 1. 在代码中的某个地方创建Semaphore(第2个构造参数

mxy_111的博客 8414

【优化调度】基于混合整数线性规划的电力系统机组组合优化(Matlab实现)

本文详细介绍了基于混合整数线性规划(MILP)的电力系统机组组合优化方法,通过Matlab实现高效调度决策。内容涵盖目标函数构建、约束条件设置及求解器调优,帮助降低发电成本并提升系统稳定性。适用于电力系统调度员和能源优化研究人员,实现从理论到实践的完整解决方案。

weixin_29050271的博客 586

Java中的Semaphore

Java中的Semaphore是控制并发资源访问的关键工具,采用许可证机制实现流量限制。它基于AQS共享锁模式实现,支持公平与非公平两种获取方式,并提供acquire/release等核心操作。典型应用场景包括连接池管理、API限流和硬件资源共享。使用时需注意许可证泄漏问题,建议在finally块中释放许可。Semaphore特别适合读多写少的高并发场景,能有效提升系统稳定性,但需合理设置许可证数量并避免嵌套死锁。

moonNife的专栏 2646

GEE生物量碳储量——利用sens和MK检验方法计算1987-2022年森林地上生物量AGB和碳储量的时空变化特征

本文是将之前已经处理好的森林生物量和碳储量数据保存到GEE Assets中,然后分别将单张影像导入到代码编辑器中,构建一个时间序列集合,并且这里需要用到的是我们给影像添加指定的时间属性,这样方便进行下一步的时序分析和空间预测。首先,需要收集1987年至2022年期间森林地上生物量AGB和碳储量数据。该数据可以通过森林清查数据、卫星遥感数据等途径获取。然后,根据这些数据,可以使用sens(敏感性分析)和MK(Mann-Kendall)方法计算时空变化特征。

此星光明博客 1265

19. SAP UI5 应用开发教程之十九 - SAP UI5 数据类型和复杂的数据绑定

通过本教程前面的步骤SAP UI5 初学者教程之十七 - 聚合绑定在 UI5 复合控件中的使用的介绍,我们已经学会了如何在 SAP UI5 里显示列表,如下图所示: 本步骤我们给该列表添加更多的业务数据,比如每张发票的金额。 按照本文的步骤完成的 SAP UI5 应用,列表如下图所示: 可以看到,同前一个步骤相比,现在 Invoices 表格里,每张发票的金额和货币单位已经显示出来了。 为了实现这个效果,本步骤的源代码位于我的 Github 这个文件夹下面: https://github.com/wan

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3693

Java的Semaphore使用总结

前言: 信号量是用来对某一共享资源所能访问的最大个数进行控制 代码示例一: package com.example; import java.util.concurrent.Semaphore; /** * Created by Will Smith on 2016/6/16. */ public class TestSemaphore { public sta

drinkingcode 4704

深入浅出:使用Python爬取链家二手房数据

在数据驱动的时代,房地产数据作为社会经济的重要指标,一直是数据分析师、投资者和研究人员关注的焦点。链家作为国内领先的房产中介平台,其二手房数据具有较高的真实性和时效性。然而,官方API的访问限制和数据获取的门槛,让很多初学者望而却步。本文将带你从零开始,使用Python编写一个符合robots.txt规范的链家二手房爬虫,获取标题、户型、价格等信息。文章不仅会提供完整代码,还会深入讲解反爬策略、请求头伪装、数据解析、异常处理等实战技术。目录前言:为什么要写这篇博客?一、爬虫前的准备:法律与道德。

2201_76125261的博客 92

Java并发之Semaphore的使用

https://www.cnblogs.com/miller-zou/p/6978422.html Java并发之Semaphore的使用 一.简介   今天突然发现,看着自己喜欢的球队发挥如此的棒,然后写着博客,这种感觉很爽。现在是半场时间,就趁着这个时间的空隙,说说Java并发包中另外一个重量级的类Semaphore,这个类从字面意义上理解是"信号量"。   那么什么是信号量呢?...

u010029439的博客 210

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java中信号量Semaphore的使用

1. Semaphore的作用 在java中,使用了synchronized关键字和Lock锁实现了资源的并发访问控制,在同一时间只允许唯一的线程进入临界区访问资源(读锁除外),这样子控制的主要目的是为了解决多个线程并发同一资源造成的数据不一致的问题。在另外一种场景下,一个资源有多个副本可供同时使用,比如打印机房有多个打印机、厕所有多个坑可供同时使用,这种情况下,Java提供了另外的并发访问控制–资源的多副本的并发访问控制,今天学习的信号量Semaphore即是其中的一种。 2. Semaphore实现原理

不见其长,日有所长 532

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java semaphore 使用场景_Java并发编程-Semaphore

基于AQS的前世今生,来学习并发工具类Semaphore。本文将从Semaphore的应用场景、源码原理解析来学习这个并发工具类。1、应用场景Semaphore用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量。还可以用来实现某种资源池限制,或者对容器施加边界。1.1当成锁使用控制同时访问某个特定资源的操作数量,代码如下:publicclassSemaphoreLock{...

weixin_33595317的博客 450

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java多线程中Semaphore对象使用

2.其他颜色表示使用Smaphore ,因为设置的是1(同一时刻只能有一个线程执行acquire之后的数据),所以需要每个线程释放后才会执行下一个线程。1.红色 没有使用Semaphore 做个参考 不会等待,有线程就会执行,不会等上个线程执行结束。

416

Java Semaphore 使用

Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以 保证合理的使用公共资源。 多年以来,我都觉得从字面上很难理解Semaphore所表达的含义,只能把它比作是控制流 量的红绿灯。比如××马路要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须 在路口等待,所以前一百辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶 入××马路,但是如果...

lbx1314ybfq的专栏 171

Java中CountDownLatch,CyclicBarrier以及Semaphore的使用场景

Java并发包中提供了很多有用的工具类来帮助开发者进行并发编程,今天我就来说说CountDownLatch,CyclicBarrier以及Semaphore这三个的用法和使用场景。 1.CountDownLatch使用场景和用法 CountDownLatch一般是用于某个线程等待其他线程执行完之后,它才能执行。例如一家人在等待爸爸妈妈回家,才能进行晚宴,示例代码如下: public cl

jianjun200607的专栏 1150

java semaphore(0)_Java 信号量 Semaphore使用方法详解

Semaphore, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。也是操作系统中用于控制进程同步互斥的量,下面我们来看看Java 信号量 Semaphore使用方法在用Semaphore 信号量的时候,感觉对公平调度比较有用,可以控制多线程争夺资源时候,最大可以几个在执行,随手写了代码测试下,如下:说明:1. acquire() 获取一个许可,如果没有就等待2. release(...

weixin_36331580的博客 443

java.util.concurrent|Semaphore使用

Semaphore是java.util.concurrent中的一个类,翻译成中文是“信号量”,它是一个计数器,使用场景基本上多线程访问共享资源,保护共享资源在某个时间只能被一个线程使用。Semaphore原理Semaphore相当于计数器,它可以增加,也可以减少,在初始化对象的时候,可以指定permits(信号量)数目,比如5,那么,Semaphore最多减少到0,最多增加不超过5。 显然,Se

wang704987562的博客 656

深度揭秘 Java Semaphore:从源码洞悉其使用原理

Semaphore是一种基于计数的信号量,它维护了一个许可(permit)的计数。每个线程在访问共享资源之前,必须先从Semaphore获取一个许可,如果许可的数量大于 0,线程可以获取许可并继续执行,同时许可的数量减 1;如果许可的数量为 0,线程将被阻塞,直到有其他线程释放许可。当线程使用完资源后,需要将许可归还给Semaphore,许可的数量加 1。// 内部同步器,继承自 AbstractQueuedSynchronizer private final Sync sync;

Android开发领域创作者 994

java 信号量Semaphore的使用

java 信号量Semaphore的使用 信号量是一种计数器,用来保护一个或者多个共享资源的访问。 信号量的使用: (1)如果一个线程要访问一个共享资源,他必须先获得信号量。如果信号量的内部计数器大于0,信号量将减1,然后允许访问这个共享资源。计数器大于0意味着又可以使用的资源,因此线程讲被允许使用其中一个资源。 (2)如果信号量等于0,信号将将会把线程植入休眠直到计数器大于0.计数器等于

学习学习再学习 3113
上一篇: Java Condition使用
下一篇: Java CountDownLatch 使用
思维的深度
博客等级 码龄11年 2万+粉丝 391原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值