【JUC】死锁的实现及其定位分析
死锁的概念
两个或两个以上的进程在执行过程中,因抢夺资源而造成的一种互相等待的现象,若无外力干涉,它们都无法继续推进,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。
实现死锁
1 class HoldLockThread implements Runnable{ 2 3 private String lockA; 4 private String lockB; 5 6 public HoldLockThread(String lockA, String lockB) { 7 this.lockA = lockA; 8 this.lockB = lockB; 9 } 10 11 @Override 12 public void run() { 13 synchronized (lockA){ 14 System.out.println(Thread.currentThread().getName()+"持有"+lockA+",尝试获得"+lockB); 15 try { 16 TimeUnit.SECONDS.sleep(2); 17 } catch (InterruptedException e) { 18 e.printStackTrace(); 19 } 20 synchronized (lockB){ 21 System.out.println(Thread.currentThread().getName()+"持有"+lockB+",尝试获得"+lockA); 22 } 23 } 24 25 } 26 } 27 public class DeadLockDemo { 28 public static void main(String[] args) { 29 String lockA = "lockA"; 30 String lockB = "lockB"; 31 new Thread( 32 new HoldLockThread(lockA,lockB),"张三" 33 ).start(); 34 new Thread( 35 new HoldLockThread(lockB,lockA),"李四" 36 ).start(); 37 } 38 }
如何排查死锁?
linux: ps -ef|grep xxx
windows:类似ps的查看进程的命令
jps可以用来排查java程序的进程,定位到进程号
jstack + 进程号 查看栈信息
栈信息的总结:两个线程导致的死锁