CSDN|Semaphore 里面居然有这么一个大坑!( 二 )
本文插图
刘能、谢广坤到了后发现 , 刚好还剩下 2 个车位 , 于是好基友手拉手 , 一起停了进去 。门口的停车位显示:余下车位 0 辆 。 没多久 , 我也到了 , 发现没有停车位了 , 怎么办呢?我只有在门口等一下了 。没一会 , 赵四办完事了 , 开着他的布加迪走了 。门口的停车位显示:余下车位 1 辆 。 我赶紧停进去 。 上面的代码想要描述的就是这样的一个事情 。但是根据提问者的描述 , “在运行时 , 有时只会执行完线程A , 其线程B和线程C都静默了 。 ” 在上面这个场景中就是:赵四的布加迪开进去停车后 , 后面刘能、谢广坤的法拉利和我的劳斯莱斯都停不进去了 。就是这样式儿的: 为什么停不进去呢?他怀疑是死锁了 , 这个怀疑有点无厘头啊 。我们先回忆一下死锁的四个必要条件:
- 互斥条件:一个资源每次只能被一个进程使用 , 即在一段时间内某资源仅为一个进程所占有 。 此时若有其他进程请求该资源 , 则请求进程只能等待 。 (不满足 , 还有两个停车位没有用呢 。 )
- 请求与保持条件:进程已经保持了至少一个资源 , 但又提出了新的资源请求 , 而该资源已被其他进程占有 , 此时请求进程被阻塞 , 但对自己已获得的资源保持不放 。 (不满足 , 张三占了一个停车位了 , 没有提出还要一个停车位的要求 , 另外的停车位也没有被占用)
- 不可剥夺条件:进程所获得的资源在未使用完毕之前 , 不能被其他进程强行夺走 , 即只能由获得该资源的进程自己来释放 。 (满足 , 张三的车不开出来 , 这个停车位理论上是不会被夺走的)
- 循环等待条件: 若干进程间形成首尾相接循环等待资源的关系 。 (不满足 , 只有我和刘能、谢广坤两拨人在等资源 , 但没有循环等待的情况 。 )
自己撸代码 下面的程序基本上是按照上面截图中的示例代码接合上面的故事改的 , 可以直接复制粘贴:
publicclassParkDemo{
publicstaticvoidmain(String args) throws InterruptedException{
Integer parkSpace =3;
System.out.println("这里有"+ parkSpace +"个停车位,先到先得啊!");
Semaphore semaphore =newSemaphore(parkSpace,true);
Thread threadA =newThread(newParkCar(1,"布加迪", semaphore),"赵四");
Thread threadB =newThread(newParkCar(2,"法拉利", semaphore),"刘能、谢广坤");
Thread threadC =newThread(newParkCar(1,"劳斯莱斯", semaphore),"why哥");
threadA.start;
threadB.start;
threadC.start;
}
}
classParkCarimplementsRunnable{
privateintn;
privateString carName;
privateSemaphore semaphore;
publicParkCar(intn, String carName, Semaphore semaphore){
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 青年|为什么花呗之前要10号还款?里面的套路竟然第一次知道
- 手机使用技巧|手机变慢了,是里面垃圾太多了,那么怎样清理手机垃圾呢?
- 地球|地心的温度,达到了太阳表面的温度,里面会存在着什么物质
- 互联网|购买手机,你是选择实体店还是网上,敢在拼多多里面买手机吗?
- CSDN|三次改变世界、却被无情出局的程序员
- CSDN|机器学习将会如何影响软件开发和测试?看完这文就懂了
- CSDN|语雀的技术架构演进之路
- CSDN|字节跳动、腾讯回应美国政府行政命令;英特尔回应20GB机密文档被泄露;优麒麟20.04.1发布|极客头条
- CSDNTB|监控系统选型,这篇不可不读
- CSDN|知乎技术热帖:Qt 这么强大为什么火不起来?