发生死锁的原因:多个线程已经占有一个资源还要争夺互相之间手中的资源(资源就是指被上锁的内容)
死锁线程代码
package com.wang; import java.util.concurrent.TimeUnit; class holdlock implements Runnable { String lockA; String lockB; public holdlock(String lockA, String lockB) { this.lockA = lockA; this.lockB = lockB; } @Override public void run() { synchronized (lockA) { System.out.println("已经获得锁" + lockA + ",尝试获得锁" + lockB); try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lockB) { System.out.println("已经持有锁" + lockB + ",尝试获取锁" + lockA); } } } } public class deadlockdemo { public static void main(String[] args) { String lockA = "locka"; String lockB = "lockb"; new Thread(new holdlock(lockA, lockB)).start(); new Thread(new holdlock(lockB, lockA)).start(); } }
线程死锁
如何定位线程死锁
使用jps -l查看所有运行的线程
使用jstack -l 线程id 查看线程的栈
结果显示线程都相互持有一个锁,并都等待对方线程手中的锁。