Java中的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 bean中大写的字段返回变成小写的问题
这篇文章主要介绍了解决springboot bean中大写的字段返回变成小写的问题,具有很好的参考价值希望对大家有所帮助。一起跟随小编过来看看吧2021-01-01springboot处理url中带斜杠/\字符的参数报400问题
这篇文章主要介绍了springboot处理url中带斜杠/\字符的参数报400问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-01-01mybatisplus 实现接口MetaObjectHandler自动填充字段值
MetaObjectHandler是MyBatis-Plus提供的一个接口,本文主要介绍了mybatisplus 实现接口MetaObjectHandler自动填充字段值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2024-07-07
最新评论