栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 同步和协作工具类 信号量Semaphore

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 同步和协作工具类 信号量Semaphore

这里写目录标题
    • 19.2 信号量Semaphore
    • 参考目录

19.2 信号量Semaphore

      之前介绍的锁都是限制只有一个线程可以同时访问一个资源。现实中,资源往往有多个,但每个同时只能被一个线程访问,比如,饭店的饭桌、火车上的卫生间。有的单个资源即使可以被并发访问,但并发访问数多了可能影响性能,所以希望限制并发访问的线程数。还有的情况,与软件的授权和计费有关,对不同等级的账户,限制不同的最大并发访问数。

      信号量类Semaphore就是用来解决这类问题的,它可以限制对资源 的并发访问数,它有两个构造方法:

      fire表示公平,含义与之前介绍的是类似的,permits表示许可数量。

      Semaphore的方法与锁是类似的,主要的方法有两类,获取许可和释放许可,主要方法有:

      我们看个简单的示例,限制并发访问的用户数不超过100,如代码 清单19-2所示。

      代码比较简单,就不赘述了。需要说明的是,如果我们将permits的 值设为1,你可能会认为它就变成了一般的锁,不过,它与一般的锁是 不同的。一般锁只能由持有锁的线程释放,而Semaphore表示的只是一 个许可数,任意线程都可以调用其release方法。主要的锁实现类ReentrantLock是可重入的,而Semaphore不是,每一次的acquire调用都 会消耗一个许可,比如,看下面的代码段:

      程序会阻塞在第二个acquire调用,永远都不会输出“acquired”。

      信号量的基本原理比较简单,也是基于AQS实现的,permits表示共享的锁个数,acquire方法就是检查锁个数是否大于0,大于则减一,获取成功,否则就等待,release就是将锁个数加一,唤醒第一个等待的线 程。

参考目录

绝大多数内容来自于:Java编程的逻辑 作者: 马俊昌(第19章 同步和协作工具类 -19.2 信号量Semaphore)

Java官方文档
https://docs.oracle.com/javase/specs/index.html

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/396734.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号