CSDN|Semaphore 里面居然有这么一个大坑!( 五 )
threadA.start; threadC.start; threadB.start; //模拟大爷劝退 threadB.interrupt; } } privateintn; } @Override System.out.println(Thread.currentThread.getName +"把自己的"+ carName +"停进来了,"+"剩余停车位:"+ semaphore.availablePermits +"辆"); //模拟停车时长 }catch(InterruptedException e) { System.err.println(Thread.currentThread.getName +"被门口大爷劝走了 。 "); }finally{ } } } 看着代码是没有毛病 , 但是运行起来你会发现 , 有可能出现这样的情况:
本文插图
本文插图
本文插图
本文插图
本文插图
增强release 你分析上面的问题会发现 , 导致问题的原因是没有获取到许可证的线程 , 调用了 release 方法 。我觉得这个设定 , 就是非常容易踩坑的地方 。 简直就是一个大坑! 我们可以就这个问题 , 对 release 方法进行增强 , 只有获取后的线程 , 才能调用 release 方法 。这一招我是在《Java高并发编程详解-深入理解并发核心库》里面学到的:
本文插图
本文插图
里面的 release 方法修改成这样了 , 执行之前先看看当前线程是否是在队列里面:
推荐阅读
- 青年|为什么花呗之前要10号还款?里面的套路竟然第一次知道
- 手机使用技巧|手机变慢了,是里面垃圾太多了,那么怎样清理手机垃圾呢?
- 地球|地心的温度,达到了太阳表面的温度,里面会存在着什么物质
- 互联网|购买手机,你是选择实体店还是网上,敢在拼多多里面买手机吗?
- CSDN|三次改变世界、却被无情出局的程序员
- CSDN|机器学习将会如何影响软件开发和测试?看完这文就懂了
- CSDN|语雀的技术架构演进之路
- CSDN|字节跳动、腾讯回应美国政府行政命令;英特尔回应20GB机密文档被泄露;优麒麟20.04.1发布|极客头条
- CSDNTB|监控系统选型,这篇不可不读
- CSDN|知乎技术热帖:Qt 这么强大为什么火不起来?
