Java中的Semaphore计数信号量详细解析

 更新时间:2023年11月20日 08:34:05   作者:梦断泪影  
这篇文章主要介绍了Java中的Semaphore计数信号量详细解析,Semaphore 是一个计数信号量,必须由获取它的线程释放,常用于限制可以访问某些资源的线程数量,例如通过 Semaphore 限流,需要的朋友可以参考下

1.介绍

Semaphore 是一个计数信号量,必须由获取它的线程释放。

常用于限制可以访问某些资源的线程数量,例如通过 Semaphore 限流。

2.具体方法

  • acquire()
    • 获取一个令牌,在获取到令牌、或者被其他线程调用中断之前线程一直处于阻塞状态。
  • acquire(int permits)
    • 获取一个令牌,在获取到令牌、或者被其他线程调用中断、或超时之前线程一直处于阻塞状态。
  • acquireUninterruptibly()
    • 获取一个令牌,在获取到令牌之前线程一直处于阻塞状态(忽略中断)。
  • tryAcquire()
    • 尝试获得令牌,返回获取令牌成功或失败,不阻塞线程。
  • tryAcquire(long timeout, TimeUnit unit)
    • 尝试获得令牌,在超时时间内循环尝试获取,直到尝试获取成功或超时返回,不阻塞线程。
  • release()
    • 释放一个令牌,唤醒一个获取令牌不成功的阻塞线程。
  • hasQueuedThreads()
    • 等待队列里是否还存在等待线程。
  • getQueueLength()
    • 获取等待队列里阻塞的线程数。
  • drainPermits()
    • 清空令牌把可用令牌数置为0,返回清空令牌的数量。
  • availablePermits()
    • 返回可用的令牌数量。

3.实现场景

模拟停车场停车,进来一辆,指示牌减一,出去一辆,指示牌加一,当指示牌显示为0时,禁止车辆进入。

public class Test_Semaphore {
    //停车场同时容纳的车辆10
    private static Semaphore semaphore=new Semaphore(10);
    public static void main(String[] args) {
        //模拟50辆车进入停车场
        for(int i=0;i<50;i++){
            Thread thread=new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        System.out.println("===="+Thread.currentThread().getName()+"来到停车场");
                        if(semaphore.availablePermits()==0){
                            System.out.println("车位不足,请耐心等待");
                        }
                        semaphore.acquire();//获取令牌尝试进入停车场
                        System.out.println(Thread.currentThread().getName()+"成功进入停车场");
                        Thread.sleep(new Random().nextInt(10000));//模拟车辆在停车场停留的时间
                        System.out.println(Thread.currentThread().getName()+"驶出停车场");
                        semaphore.release();//释放令牌,腾出停车场车位
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            },i+"号车");
            thread.start();
        }
    }
}

到此这篇关于Java中的Semaphore计数信号量详细解析的文章就介绍到这了,更多相关Semaphore计数信号量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • linux部署springBoot项目的脚本问题

    linux部署springBoot项目的脚本问题

    这篇文章主要介绍了linux部署springBoot项目的脚本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • Java Volatile关键字实现原理过程解析

    Java Volatile关键字实现原理过程解析

    这篇文章主要介绍了Java Volatile关键字实现原理过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 创建动态代理对象bean,并动态注入到spring容器中的操作

    创建动态代理对象bean,并动态注入到spring容器中的操作

    这篇文章主要介绍了创建动态代理对象bean,并动态注入到spring容器中的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Springboot整合Jedis实现单机版或哨兵版可切换配置方法

    Springboot整合Jedis实现单机版或哨兵版可切换配置方法

    这篇文章主要介绍了Springboot整合Jedis实现单机版或哨兵版可切换配置方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-11-11
  • Spring对事务管理的支持

    Spring对事务管理的支持

    今天小编就为大家分享一篇关于Spring对事务管理的支持,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 详解MyBatis多数据源配置(读写分离)

    详解MyBatis多数据源配置(读写分离)

    这篇文章主要介绍了详解MyBatis多数据源配置(读写分离),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • SpringBoot项目配置多数据源的两种方式详解

    SpringBoot项目配置多数据源的两种方式详解

    这篇文章主要为大家详细介绍了SpringBoot项目配置多数据源的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2026-01-01
  • Java 数据库连接池 Tomcat介绍

    Java 数据库连接池 Tomcat介绍

    这篇文章主要给大家分享了 Java 数据库连接池 Tomcat介绍,omcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。下面来看看文章内容的详细介绍吧
    2021-11-11
  • 基于Java 数组内存分配的相关问题

    基于Java 数组内存分配的相关问题

    本篇文章是对Java中数组内存分配进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Java基础之详解基本数据类型的使用

    Java基础之详解基本数据类型的使用

    今天给大家带来的是关于Java基础的相关知识,文章围绕着基本数据类型的使用展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06

最新评论