
本文插图
方法解释 我估计很多不太了解 semaphore 的朋友看完前面这两部分也还是略微有点懵逼 。没事 , 所有的疑惑将在这一小节解开 。在上面的测试案例中 , 我们只用到了 semaphore 的四个方法:
- availablePermits:获取剩余可用许可证 。
- drainPermits :获取剩余可用许可证 。
- release(int n):释放指定数量的许可证 。
- acquire(int n):申请指定数量的许可证 。
首先看 availablePermits 和 drainPermits 这个两个方法的差异:

本文插图
这两个地方的文档描述 , 有点玩文字游戏的意思了 。 稍不留神就被带进去了 。你仔细看:availablePermits 只是 return 当前可用的许可证数量 。 而 drainPermits 是 acquires and return , 它先全部获取后再返回 。availablePermits 只是看看还有多少许可证 , drainPermits 是拿走所有剩下的许可证 。所以在上面的场景下 , 这两个方法的返回值是一样的 , 但是内部处理完全内部不一样:

本文插图
当我把这个发现汇报给保洁大爷后 , 大爷轻轻一笑:“小伙子 , 要不你去查一下 drainPermits 前面的 drain 的意思?” 查完之后 , 我留下了英语四级的泪水:

本文插图
见名知意 。 同学们 , 可见英语对编程还是非常重要的 。接下来先看看释放的方法:release 。

本文插图
该方法就是释放指定数量许可证 。 释放 , 就意味着许可证的增加 。 就类似于刘能、谢广坤把他们各自的法拉利从停车位开出来 , 驶离停车场 , 这时停车场就会多两个停车位 。上面红框框起来的部分是它的主要逻辑 。 大家自己看一下 , 我就不翻译了 , 大概意思就是释放许可证之后 , 其他等着用许可证的线程就可以看一下释放之后的许可证数量是否够用 , 如果够就可以获取许可证 , 然后运行了 。该方法的精华在 599 到 602 行的说明中:
这句话非常关键:说的是执行 release 操作的线程不一定非得是执行了 acquire 方法的线程 。开发人员 , 需要根据实际场景来保证 semaphore 的正确使用 。release 操作这里 , 大家都知道需要放到 finally 代码块里面去执行 。 但是正是这个认知 , 是最容易踩坑的地方 , 而且出了问题还非常不好排查的那种 。放肯定是要放在 finally 代码块里面的 , 只是怎么放 , 这里有点讲究 。我结合下一节的例子和 acquire 方法一起说明:

本文插图
acquire 方法主要先关注我红框框起来的部分 。从该方法的源码可以看出 , 会抛出 InterruptException 异常 。 记住这点 , 我们在下一节 , 带入场景讨论 。
release使用不当的大坑 我们还是带入之前停车的场景 。 假设赵四和我先把车停进去了 , 这个时候刘能、谢广坤他们来了 , 发现车位不够了 , 两个好基友嘛 , 就等着 , 非要停在一起:

本文插图
等了一会 , 我们一直没出来 , 门口看车的大爷出来对他们说:“我估摸着你们还得等很长时间 , 别等了 , 快走吧 。 ” 于是 , 他们开车离去 。来 , 就这个场景 , 整一段代码:
推荐阅读
-
行业互联网苹果秋季发布会:史上最香iPad、Apple Watch来了
-
-
光速火箭:航母霸主地位可能不保,055之后我们造啥?058全能舰了解一下
-
-
biu时尚|王智这么穿衣服真有心机,在宽厚的西装对比下,显腿更精瘦了
-
【IPO早知道】信息安全服务商上讯信息终止上市辅导,两次获得软银中国资本投资
-
-
陈萌|婚礼倒计时!陈萌晒结婚喜糖,家里布置温馨,曾传出怀上双胞胎
-
-
体坛新论点|陈佩妍,孙杰请关注她们联赛中的表现,将带来不一样的惊喜,仲慧
-
动物园狮子与游客对吼-游客奇葩举动逼得狮子“对话”
-
圆滚滚足球君|但他留给青岛4份珍贵的礼物,利略回欧洲辅佐瓜帅了
-
一姐说时尚王俊凯的7大发型!中分萌、19分酷、28分成熟、无刘海最美
-
-
-
「星座小桔子」冷酷无情,不讲情面,心狠手辣的四星座,十二星座中
-
萌宠趣闻录|不然化妆品会遭殃,铲屎官:我肉痛!,不要让猫咪靠近梳妆台
-
很怕讨厌我的人 总是沉浸在过去痛苦的回忆里 时不时会去想 这是心理有问题吗?
-
央视网|重庆綦江洪水预警升级为黄色 相关人员请及时避险
-
杨幂陈伟霆互拍|【片场趣事】杨幂陈伟霆互拍 真是越来越期待《斛珠夫人》了