死锁

来源:互联网 发布:网络故障诊断1一1 编辑:程序博客网 时间:2024/06/05 16:32

什么是死锁?

死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
以生活中的一些事为例:
小情侣吵架了,男孩子在等着女孩子认错,女孩子同时也在等男孩子认错,但双方又都不肯认错,这样两人就没法和好。这就跟死锁很相似了,A持有锁,同时等待B手上持有的锁,B持有锁,同时等待A手上持有的锁,各自又都不肯释放自己手头上的锁,这样就造成了死锁。

看看下面这段程序:

package thread;public class DeadLock {private static Object A = new Object();private static Object B = new Object();private void deadLock(){new Thread(()->{synchronized(A){try {//休眠为了让另一个进程先运行Thread.sleep(2000);synchronized (B) {System.out.println("B");}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();new Thread(()->{synchronized (B) {synchronized (A) {System.out.println("A");}}}).start();}public static void main(String[] args) {new DeadLock().deadLock();}}



运行之后,控制台没有任何输出,这时候我们使用jdk自带的检查工具jconsole看看,可以看到检测到死锁


Thread-0在等待着Thread-1上的锁,Thread-1在等待着Thread-0上的锁,各不释放,就造成死锁。

这里顺带提一下,使用多线程编程的时候,最好给每个新程一个线程名,而不是用默认的线程名,这样当线程数量多的时候,一旦出现问题,很难排查。