死锁指的是两个或多个计算单元(流程,线程或公司),他们正在等待对方停止执行以获取系统资源,但没有事先退出,这称为僵局。
僵局的示例代码如下:
上述程序的执行结果如下:
从上面的结果可以看出,线程1和线程2进入了死锁状态,并正在等待对方释放锁。
从上面的示例分析中可以得出结论,需要满足以下四个条件:
只有同时满足这4个条件时,问题才能导致僵局的问题。
然后,要产生死锁,我们必须同时满足上述四个条件,然后我们可以通过破坏任何条件来解决死锁的问题。
接下来,让我们进行分析,哪些可以被4个死亡锁的条件摧毁?哪些不能销毁?
通过上述分析,我们可以得出结论,我们只能通过破坏请求并维持条件或环形电路来解决死锁问题。解决死锁的问题。
SO称为的顺序锁是指顺序获得锁,以避免环道的状况,从而解决了死锁的问题。
当我们不使用订单锁定时,程序的执行可能是:
首先支付锁定,然后获得锁B,线程2和线程1同时获得螺纹2首先获取锁B,然后获得锁定A,以便双方占据各自的资源(锁定A和锁定B)首先)然后尝试获取对方的锁,这会导致戒指等待问题,并最终导致死锁的问题。
目前,我们只需要统一螺纹1和螺纹2的顺序即可获得锁,也就是说,在螺纹1和螺纹2同时执行后,他们首先获得锁定A,然后获得锁定。执行过程如下图所示:
因为只有一个线程可以成功获取锁定A,因此无法获得锁的线程A将等待锁定A。目前,锁定A的线程将继续获取锁B,因为没有线程可以抓住并拥有锁定B,然后获取锁定。相应的代码,然后发布所有锁定资源,然后等待锁定的线程可以成功获得锁定资源,执行后续代码,以免它不可能这样做,因此不会。死亡锁的问题发生了。
订单锁的实现代码如下:
上述过程的执行结果如下:从上述执行的结果中,可以看出该程序没有死锁的问题。
旋转锁是避免通过打破“请求和维持条件”来造成死锁。它意识到其实现的是尝试通过旋转来获取锁。
询问锁的重复的实现需要重新输入的trylock方法。特定的实施代码如下:如下:
上述程序的执行结果如下:
从上面的结果可以看出,上述代码没有问题。
本文介绍了Dead Lock的两种解决方案:
作者:爪哇中国社区