本文共 2009 字,大约阅读时间需要 6 分钟。
死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
死锁的发生是由于资源竞争导致的,导致死锁的原因如下:
死锁的发生的四个必要条件:
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
为了说明死锁,我们下面举一个例子来说明:
线程A持有资源A然后试图获取资源B,线程2持有资源B同时试图获取资源A,这样线程A和B都不能获取彼此想要的资源,导致整个程序不能向下推进。具体代码如下:
class DeadLockRunnable implements Runnable { private String first; private String second; public DeadLockRunnable(String first, String second) { this.first = first; this.second = second; } @Override public void run() { synchronized (first) { System.out.println(Thread.currentThread().getName() + " obtain: " + first); try { Thread.sleep(100); synchronized (second) { System.out.println(Thread.currentThread().getName() + " obtain: " + second); } } catch (InterruptedException e) { e.printStackTrace(); } } }}public class DeadLock { public static void main(String[] args) throws InterruptedException { String lockA = "lockA"; String lockB = "LockB"; Thread t1 = new Thread(new DeadLockRunnable(lockA, lockB)); Thread t2 = new Thread(new DeadLockRunnable(lockB, lockA)); t1.start(); t2.start(); t1.join(); t2.join(); }}
运行结果:
从结果中可以看出,两个线程都不能再次获得想要的资源,程序一直处于“停滞”状态。
那么出现这种情况怎么定位呢?
通过输出我们看到Thread-1和Thread-0都处于BLOCKED状态。至此我们基本可以知道程序发生了死锁。
死锁的预防