在面试的时候在问起线程锁的部分,经常被问到“什么是死锁”、“怎么避免死锁”之类的问题,甚至开发中在使用锁的时候因为逻辑不严谨导致出现程序无法正确终止或者执行的情况,这些都跟死锁有着不可分割的联系,这篇文章我们就来说说死锁的问题。
- 什么是死锁
死锁就是当两个或两个以上的线程因竞争相同资源而处于无限期的等待,这样就导致了多个线程的阻塞,出现程序无法正常运行和终止的情况。
举个例子说明下死锁的现象:小明和小张要玩一个玩具,这个玩具有两部分组成必须两部分组装起来才能玩,小明拿了第一部分,小张拿了第二部分;这时候小明等着小张给他第二部分进行组装玩,而小张也等着小明把第一部分给他进行组装玩;两个人都占用着资源谁也不给谁一部分,那么就出现了小明、小张都玩不成的情况;
换成线程中出现死锁解释也是这样,如图:
现在有两个线程A和线程B,线程A通过同步等方式获取了锁1,线程B获取了锁2;在持有锁1的情况下线程A想要再获取锁2,同样的在持有锁2的情况下线程B也想要获取锁1,但是现在锁1和锁2都被线程锁持有并没有被释放,所以就出现了线程A等着线程B释放锁2,线程B等着线程A释放锁1的情况,最终出现两个线程无限期的等待程序无法终止,那么就造成了死锁。