当前位置:   article > 正文

并发编程2:并发的问题:死锁——两段不同的逻辑都在等待对方的锁释放才能继续执行_同时拿到两把锁才能继续往下执行——怎么实现

同时拿到两把锁才能继续往下执行——怎么实现

1、什么是死锁

死锁:即多个线程因竞争而造成一种互相等待的现象。

简单一点说:

一个资源每次只能被一个进程使用,而当正在占用这个资源的进程又需要去使用其它资源时正好处于阻塞状态,导致使用中的资源无法释放,请求的资源又处于无限等待中。

如果所有代码都是我们自己开发的,不太会出现这样的情况,至少在不是太复杂的情景下应该不会刻意去设计一个死锁的代码,但如果调用了其它外部的api或一些共享的资源时,就不可避免的出现一些死锁的情况。

如:一个线程T1持有锁R1并且申请获得锁R2,而另一个线程T2持有锁R2并且申请获得锁R1,因为默认的锁申请操作都是阻塞的,所以线程T1和T2永远被阻塞了。导致了死锁。

 

但是实际环境中的死锁往往比这个复杂的多。可能会有多个线程形成了一个死锁的环路,比如:线程T1持有锁R1并且申请获得锁R2,而线程T2持有锁R2并且申请获得锁R3,而线程T3持有锁R3并且申请获得锁R1,这样导致了一个锁依赖的环路:T1依赖T2的锁R2,T2依赖T3的锁R3,而T3依赖T1的锁R1。从而导致了死锁。

2、写一个死锁:

  1. package pub.ryan.concurrency.stage1;
  2. public class DeadLockDemo {
  3. public static void main(String[] args) {
  4. Event event = new Event()
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/721081
推荐阅读
相关标签
  

闽ICP备14008679号