首页 > 编程语言 >Java Semaphore 信号量详解

Java Semaphore 信号量详解

时间:2023-05-19 16:00:20浏览次数:51  
标签:Java Thread 信号量 线程 Semaphore release main

Semaphore基本使用场景

Semaphore的基本使用场景是限制一定数量的线程能够去执行.

举个简单的例子: 一个单向隧道能同时容纳10个小汽车或5个卡车通过(1个卡车等效与2个小汽车), 而隧道入口记录着当前已经在隧道内的汽车等效比重. 比如1个小汽车和1个卡车, 则隧道入口显示3. 若隧道入口显示10表示已经满了. 当汽车驶出隧道之后, 隧道入口显示的数字则会相应的减小. 于这个示例相符合场景非常适合用信号量.

Semaphore在构造的时候, 可以传入一个int. 表示有多少许可(permit). 线程获取锁的时候, 要告诉信号量使用多少许可(类比与小汽车和卡车), 当线程要使用的许可不足时, 则调用的线程则会被阻塞. 可以和上面简单的举例进行初步理解.

Semaphore - 信号量

下面是简单代码示范.

public static void main(String[] args) {
    // 表示有2个许可.
    Semaphore sem = new Semaphore(2);
    for (int i = 0; i < 3; i++) {
        new Thread(() -> {
            try {
                // 默认使用一个许可.
                sem.acquire();
                System.out.println(Thread.currentThread() + " I get it.");
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread() + " I release it.");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                sem.release();
            }
        }).start();
    }
}

 

代码输出如下:

Thread[Thread-0,5,main] I get it.
Thread[Thread-1,5,main] I get it.
Thread[Thread-1,5,main] I release it.
Thread[Thread-0,5,main] I release it.
Thread[Thread-2,5,main] I get it.
Thread[Thread-2,5,main] I release it.

上述大致可以分为以下三步:

  1. 第一步: 首先线程0和1, 获取锁. 线程3被被阻塞.
  2. 第二步: 3秒过后, 线程0和线程1分别释放锁,
  3. 第三步: 线程2可以获得到锁.

(348条消息) Semaphore详解_JackieZhengChina的博客-CSDN博客

   

标签:Java,Thread,信号量,线程,Semaphore,release,main
From: https://www.cnblogs.com/wanglongjiang/p/17415423.html

相关文章

  • JAVA学习之常用类
    首先是八大Wrapper类Wrapper类包装类:1.针对八种基本数据类型相应的引用类型-包装类。2.有了类的特点,就可以调用类的方法了。除了char->Character和int->Integer,其他的包装类都是再基本数据类型的基础上把首字母大写得到的。包装类和基本数据类型的转换jdk5之后就实现了自......
  • JavaScript split() 方法
    定义和用法:split()方法用于把一个字符串分割成字符串数组。stringObject.split(separator,howmany)其中:separator必需。字符串或正则表达式,从该参数指定的地方分割stringObject。howmany可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指......
  • javaweb
    一、html和css二、JavaScript三、Jquery(jquery+jquery动画)四、xml五、tomcat&servlet六、jsp七、el表达式(包含jstl标签库)八、文件上传和下载九、Cookie(包含Session)十、Filter十一、Json、ajax、i18十二、axios......
  • JavaScript
    二、JavaScript1、JavaScript介绍JavaScript语言诞生主要是完成页面的数据验证。因此它运行在客户端,需要运行浏览器来解析执行JavaScript代码。JS是Netscape网景公司的产品,最早取名为LiveScript;为了吸引更多java程序员,更名为JavaScript。JS是弱类型,Java是强类型。弱类型就是类......
  • Java 枚举
     Java5.0引入了枚举,枚举限制变量只能是预先设定好的值。使用枚举可以减少代码中的bug。例如,我们为果汁店设计一个程序,它将限制果汁为小杯、中杯、大杯。这就意味着它不允许顾客点除了这三种尺寸外的果汁。实例classFreshJuice{enumFreshJuiceSize{SMALL,MEDIUM,LAR......
  • Java 对象和类
     Java作为一种面向对象语言。支持以下基本概念:多态继承封装抽象类对象实例方法重载本节我们重点研究对象和类的概念。对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。类:类是一......
  • Java中的对象
    Java中的对象 现在让我们深入了解什么是对象。看看周围真实的世界,会发现身边有很多对象,车,狗,人等等。所有这些对象都有自己的状态和行为。拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑。对比现实对象和软件对象,它们之间十分相似。软件对象也有状态和行为。......
  • 从零玩转Java和word模板-从零玩转java和word模板
    title:从零玩转Java和word模板date:2021-12-2218:38:14.086updated:2021-12-2218:38:14.086url:https://www.yby6.com/archives/从零玩转java和word模板categories:tags:前言公司需要使用生成word模板将Java信息输入到word指定位置......
  • java正确开发系列:使用hutool计算出时间段范围内的每一天
    背景:前端入参分别有startDate和endDate,类型为字符串,格式为:2023-01-01、2023-05-01,需要后端计算出1月到5月的每一天 代码如下:StringstartDateStr=res.getStartDate();StringendDateStr=res.getEndDate();DateTimestartDate=DateUtil.pars......
  • java-raft框架之atomix进行分布式管理
    共识算法在一个分布式的系统中,管理各个节点的一致性(共识)一直是个很有难度的问题。在近几十年的发展中,于1990年诞生的Paxos算法是其中最为经典的代表,并一统江湖数几十载。如著名的zookeeper、chubby都是基于Paxos算法的经典应用。不过Paxos算法的复杂度和难以理解性,也吸引了一些大佬......