线程死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象。若无外 力作用,它们都将无法推进下去。
如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方持有的资源,所以这两个 线程就会互相等待而进入死锁状态。
下面通过例子说明线程死锁
publicclassDeadLockDemo { privatestaticObjectresource1=newObject();//资源 1privatestaticObjectresource2=newObject();//资源 2publicstaticvoidmain(String[] args) { newThread(() -> { synchronized (resource1) { System.out.println(Thread.currentThread() +"get resource1"); try { Thread.sleep(1000); } catch (InterruptedExceptione) { e.printStackTrace(); } System.out.println(Thread.currentThread() +"waiting get resource2"); synchronized (resource2) { System.out.println(Thread.currentThread() +"get resource2"); } } }, "线程 1").start(); newThread(() -> { synchronized (resource2) { System.out.println(Thread.currentThread() +"get resource2"); try { Thread.sleep(1000); } catch (InterruptedExceptione) { e.printStackTrace(); } System.out.println(Thread.currentThread() +"waiting get resource1"); synchronized (resource1) { System.out.println(Thread.currentThread() +"get resource1"); } } }, "线程 2").start(); } }
代码输出如下:
Thread[线程1,5,main]getresource1Thread[线程2,5,main]getresource2Thread[线程1,5,main]waitinggetresource2Thread[线程2,5,main]waitinggetresource1
线程 A 通过 synchronized (resource1) 获得 resource1 的监视器锁,然后通过 Thread.sleep(1000) 。让线程 A 休眠 1s 为的是让线程 B 得到执行然后获取到 resource2 的监视器 锁。线程 A 和线程 B 休眠结束了都开始企图请求获取对方的资源,然后这两个线程就会陷入互相等待的 状态,这也就产生了死锁。