我靠!Semaphore里面居然有这么一个大坑! (4)

简介: 我靠!Semaphore里面居然有这么一个大坑! (4)

在往前看日志发现,原来是刘能、谢广坤走后,显示了剩余停车位 3 辆。


问题就出在这个地方。


而这个地方对应的代码是这样的:


image.png


有没有一点恍然大悟的感觉。


50 行抛出了 InterruptedException,导致明明没有获取到许可证的线程,执行了 release 方法,而该方法导致许可证增加。


在我们的例子里面就是刘能、谢广坤的车都还没停进去,走的时候门口的显示屏就增加了两个停车位。


这就是坑,就是你代码中的 BUG 潜伏地带。


那么怎么修复呢?


答案已经呼之欲出了,这个地方需要 catch 起来,如果出现中断异常,直接返回:


image.png


image.png


抛出 InterruptedException 后,分配给这个线程的所有许可证都会被分配给其他想要获取许可证的线程,就像通过调用 release 方法一样。


增强release


你分析上面的问题会发现,导致问题的原因是没有获取到许可证的线程,调用了 release 方法。


我觉得这个设定,就是非常容易踩坑的地方。简直就是一个大坑!


我们可以就这个问题,对 release 方法进行增强,只有获取后的线程,才能调用 release 方法。


这一招我是在《Java高并发编程详解-深入理解并发核心库》里面学到的:


image.png


image.png


image.png



这本书写的还是不错的,推荐给大家。


最后说一句(求关注)


才疏学浅,难免会有纰漏,如果你发现了错误的地方,还请你留言指出来,我对其加以修改。


感谢您的阅读,我坚持原创,十分欢迎并感谢您的关注。


image.png


我是 why,一个被代码耽误的文学创作者,不是大佬,但是喜欢分享,是一个又暖又有料的四川好男人

目录
相关文章
|
4天前
|
存储 安全 Java
Java多线程实战-从零手搓一个简易线程池(一)定义任务等待队列
Java多线程实战-从零手搓一个简易线程池(一)定义任务等待队列
|
9月前
|
存储 Java
第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁【Java面试题】
第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁【Java面试题】
32 0
|
7月前
|
设计模式 安全 Java
JUC第十二讲:JUC锁 - 看不懂锁核心类 AQS 原理来打我
JUC第十二讲:JUC锁 - 看不懂锁核心类 AQS 原理来打我
|
存储 安全 Java
大白话讲解synchronized锁升级套路
synchronized锁是啥?锁其实就是一个对象,随便哪一个都可以,Java中所有的对象都是锁,换句话说,Java中所有对象都可以成为锁。 这次我们主要聊的是synchronized锁升级的套路
深入理解JUC:第六章:Semaphore信号灯
深入理解JUC:第六章:Semaphore信号灯
深入理解JUC:第六章:Semaphore信号灯
|
缓存 算法 Java
看完你就明白的锁系列之自旋锁
在上一篇文章 看完你就应该能明白的悲观锁和乐观锁 中我们已经学习到了什么是悲观锁和乐观锁、悲观锁和乐观锁的实现、优缺点分别是什么。其中乐观锁的实现之一 CAS 算法中提到了一个自旋锁的概念,为了全面理解 CAS 算法就首先需要了解一下自旋锁 是什么,自旋锁的适用场景和优缺点分别是什么,别着急,下面为你一一列举。
117 0
看完你就明白的锁系列之自旋锁
我靠!Semaphore里面居然有这么一个大坑! (2)
我靠!Semaphore里面居然有这么一个大坑! (2)
63 0
我靠!Semaphore里面居然有这么一个大坑! (2)
我靠!Semaphore里面居然有这么一个大坑! (3)
我靠!Semaphore里面居然有这么一个大坑! (3)
237 0
我靠!Semaphore里面居然有这么一个大坑! (3)
我靠!Semaphore里面居然有这么一个大坑! (1)
我靠!Semaphore里面居然有这么一个大坑! (1)
105 0
我靠!Semaphore里面居然有这么一个大坑! (1)
|
安全
当Synchronized遇到这玩意儿,有个大坑,要注意! (上)
当Synchronized遇到这玩意儿,有个大坑,要注意! (上)
161 0
当Synchronized遇到这玩意儿,有个大坑,要注意! (上)