CSDN|Semaphore 里面居然有这么一个大坑!( 二 )


本文插图
刘能、谢广坤到了后发现 , 刚好还剩下 2 个车位 , 于是好基友手拉手 , 一起停了进去 。门口的停车位显示:余下车位 0 辆 。

CSDN|Semaphore 里面居然有这么一个大坑!
本文插图
没多久 , 我也到了 , 发现没有停车位了 , 怎么办呢?我只有在门口等一下了 。没一会 , 赵四办完事了 , 开着他的布加迪走了 。门口的停车位显示:余下车位 1 辆 。
CSDN|Semaphore 里面居然有这么一个大坑!
本文插图
我赶紧停进去 。
CSDN|Semaphore 里面居然有这么一个大坑!
本文插图
上面的代码想要描述的就是这样的一个事情 。但是根据提问者的描述 , “在运行时 , 有时只会执行完线程A , 其线程B和线程C都静默了 。 ” 在上面这个场景中就是:赵四的布加迪开进去停车后 , 后面刘能、谢广坤的法拉利和我的劳斯莱斯都停不进去了 。就是这样式儿的:
CSDN|Semaphore 里面居然有这么一个大坑!
本文插图
为什么停不进去呢?他怀疑是死锁了 , 这个怀疑有点无厘头啊 。我们先回忆一下死锁的四个必要条件:
  • 互斥条件:一个资源每次只能被一个进程使用 , 即在一段时间内某资源仅为一个进程所占有 。 此时若有其他进程请求该资源 , 则请求进程只能等待 。 (不满足 , 还有两个停车位没有用呢 。 )
  • 请求与保持条件:进程已经保持了至少一个资源 , 但又提出了新的资源请求 , 而该资源已被其他进程占有 , 此时请求进程被阻塞 , 但对自己已获得的资源保持不放 。 (不满足 , 张三占了一个停车位了 , 没有提出还要一个停车位的要求 , 另外的停车位也没有被占用)
  • 不可剥夺条件:进程所获得的资源在未使用完毕之前 , 不能被其他进程强行夺走 , 即只能由获得该资源的进程自己来释放 。 (满足 , 张三的车不开出来 , 这个停车位理论上是不会被夺走的)
  • 循环等待条件: 若干进程间形成首尾相接循环等待资源的关系 。 (不满足 , 只有我和刘能、谢广坤两拨人在等资源 , 但没有循环等待的情况 。 )
这四个条件是死锁的必要条件 , 必要条件就是说只要有死锁了 , 这些条件必然全部成立 。而经过分析 , 我们发现没有满足死锁的必要条件 。 那为什么会出现这样的现象呢? 我们先根据上面的场景 , 自己写一段代码 。
自己撸代码 下面的程序基本上是按照上面截图中的示例代码接合上面的故事改的 , 可以直接复制粘贴: 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){


推荐阅读