Java中的Semaphore信号量简单使用代码实例

 更新时间:2023年12月18日 10:33:06   作者:暴躁的程序猿啊  
这篇文章主要介绍了Java中的Semaphore信号量简单使用代码实例,Semaphore是用来保护一个或者多个共享资源的访问,Semaphore内部维护了一个计数器,其值为可以访问的共享资源的个数,一个线程要访问共享资源,需要的朋友可以参考下

Semaphore信号量

Semaphore是用来保护一个或者多个共享资源的访问,Semaphore内部维护了一个计数器,其值为可以访问的共享资源的个数。

一个线程要访问共享资源,先获得信号量,如果信号量的计数器值大于1,意味着有共享资源可以访问,则使其计数器值减去1,再访问共享资源。

如果计数器值为0,线程进入休眠。当某个线程使用完共享资源后,释放信号量,并将信号量内部的计数器加1,之前进入休眠的线程将被唤醒并再次试图获得信号量。 例如:停车场的车位 ,有空闲车位才可以停,没有空闲车位只能等待。 主要使用方法:

acquire() 从信号量获取一个许可,在提供一个许可之前一直将线程阻塞 否则线程被中断

release() 释放一个许可,将其返回给信号量

例子: 停车场有五个停车位 有十辆车要停

public class SemaphoreDemo {
    public static void main(String[] args) {
        //参数 许可数量  例有五个空停车位
        Semaphore semaphore = new Semaphore(5);
        //模拟10辆汽车  要停车  只能有五辆汽车同时停  其他车只能等待
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                try {
                    //acquire()得到  成功拿到车位停车
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + "抢到车位");
                    //停两秒钟的车
                    TimeUnit.SECONDS.sleep(2);
                    //离开车位
                    System.out.println(Thread.currentThread().getName() + "离开车位");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    //release()释放
                    semaphore.release();
                }
            }).start();
        }
    }
}

在这里插入图片描述

到此这篇关于Java中的Semaphore信号量简单使用代码实例的文章就介绍到这了,更多相关Semaphore信号量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于SpringBoot开机启动与@Order注解

    基于SpringBoot开机启动与@Order注解

    这篇文章主要介绍了SpringBoot开机启动与@Order注解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • springboot自带的缓存@EnableCaching用法

    springboot自带的缓存@EnableCaching用法

    这篇文章主要介绍了springboot自带的缓存@EnableCaching用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 用java实现跳动的小球示例代码

    用java实现跳动的小球示例代码

    这篇文章主要介绍了用java实现跳动的小球,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Spring Boot应用关闭分析详解

    Spring Boot应用关闭分析详解

    本文挖掘了Spring Boot的关闭方式,并列举了关闭方式,从原理、源码的角度阐述了Spring Boot的关闭代码及扩展点,感兴趣的朋友一起看看吧
    2024-12-12
  • Spring Bean三种注入方式详解

    Spring Bean三种注入方式详解

    本篇文章主要介绍了Spring Bean三种注入方式详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • SpringBoot2 整合FreeMarker实现页面静态化示例详解

    SpringBoot2 整合FreeMarker实现页面静态化示例详解

    这篇文章主要介绍了SpringBoot2 整合FreeMarker实现页面静态化示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java多线程实现异步调用的方法

    Java多线程实现异步调用的方法

    本文给大家分享java多线程实现异步调用的方法,感兴趣的朋友跟着脚本之家小编一起学习吧
    2015-09-09
  • SpringBoot整合Redis实现登录失败锁定功能(实例详解)

    SpringBoot整合Redis实现登录失败锁定功能(实例详解)

    本文我们已经探讨如何利用Redis来实现锁定账户的安全措施,以及通过SpringBoot整合Redis实现了这一功能,感兴趣的朋友跟随小编一起学习下吧
    2024-02-02
  • WIN10环境 Maven的安装与配置详细教程

    WIN10环境 Maven的安装与配置详细教程

    这篇文章主要介绍了WIN10环境 Maven的安装与配置详细教程,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • resty的缓存技术设计及使用

    resty的缓存技术设计及使用

    这篇文章主要为大家介绍了resty缓存技术的设计及使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03

最新评论