死锁指的是两个线程都在等待另一个线程释放锁,比如:线程T1获取了锁L1然后在等待获取锁L2,线程T2获取了锁L2然后在等待获取锁L1,这样就产生了死锁。嵌套管程锁死指的是一个线程获取锁后在另一个锁上调用了wait进入等待另一个线程发送唤醒信号,比如L:线程T1获取了锁L1然后在锁L2上调用了wait方法,线程T2需要同时获取锁L1和L2才能向T1发送信号,这样就产生了嵌套管程锁死。
参考资料:
嵌套管程锁死 VS 死锁
嵌套管程锁死与死锁很像:都是线程最后被一直阻塞着互相等待。
但是两者又不完全相同。在中我们已经对死锁有了个大概的解释,死锁通常是因为两个线程获取锁的顺序不一致造成的,线程1锁住A,等待获取B,线程2已经获取了B,再等待获取A。如中所说的,死锁可以通过总是以相同的顺序获取锁来避免。
但是发生嵌套管程锁死时锁获取的顺序是一致的。线程1获得A和B,然后释放B,等待线程2的信号。线程2需要同时获得A和B,才能向线程1发送信号。所以,一个线程在等待唤醒,另一个线程在等待想要的锁被释放。不同点归纳如下:
死锁中,二个线程都在等待对方释放锁。嵌套管程锁死中,线程1持有锁A,同时等待从线程2发来的信号,线程2需要锁A来发信号给线程1。