死鎖的概念
兩個或兩個以上的進程在執行過程中,因搶奪資源而造成的一種互相等待的現象,若無外力干涉,它們都無法繼續推進,如果系統資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。
實現死鎖
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 + 進程號 查看棧信息
棧信息的總結:兩個線程導致的死鎖