在往前看日志发现,原来是刘能、谢广坤走后,显示了剩余停车位 3 辆。
问题就出在这个地方。
而这个地方对应的代码是这样的:
有没有一点恍然大悟的感觉。
50 行抛出了 InterruptedException,导致明明没有获取到许可证的线程,执行了 release 方法,而该方法导致许可证增加。
在我们的例子里面就是刘能、谢广坤的车都还没停进去,走的时候门口的显示屏就增加了两个停车位。
这就是坑,就是你代码中的 BUG 潜伏地带。
那么怎么修复呢?
答案已经呼之欲出了,这个地方需要 catch 起来,如果出现中断异常,直接返回:
抛出 InterruptedException 后,分配给这个线程的所有许可证都会被分配给其他想要获取许可证的线程,就像通过调用 release 方法一样。
增强release
你分析上面的问题会发现,导致问题的原因是没有获取到许可证的线程,调用了 release 方法。
我觉得这个设定,就是非常容易踩坑的地方。简直就是一个大坑!
我们可以就这个问题,对 release 方法进行增强,只有获取后的线程,才能调用 release 方法。
这一招我是在《Java高并发编程详解-深入理解并发核心库》里面学到的:
这本书写的还是不错的,推荐给大家。
最后说一句(求关注)
才疏学浅,难免会有纰漏,如果你发现了错误的地方,还请你留言指出来,我对其加以修改。
感谢您的阅读,我坚持原创,十分欢迎并感谢您的关注。
我是 why,一个被代码耽误的文学创作者,不是大佬,但是喜欢分享,是一个又暖又有料的四川好男人。