死鎖編碼以及定位分析
- 產生死鎖的原因
- 死鎖是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種相互等待的現象,如果無外力的干涉那它們都將無法推進下去,如果系統的資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。
- 代碼案例
public class DeadLockDemo {
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
DeadLockDemo deadLockDemo = new DeadLockDemo();
Executor executor = Executors.newFixedThreadPool(2);
executor.execute(() -> deadLockDemo.method(lockA, lockB));
executor.execute(() -> deadLockDemo.method(lockB, lockA));
}
public void method(String lock1, String lock2) {
synchronized (lock1) {
System.out.println(Thread.currentThread().getName() + "--獲取到:" + lock1 + "; 嘗試獲取:" + lock2);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2) {
System.out.println("獲取到兩把鎖!");
}
}
}
}
解決
- jps -l 命令查定位進程號
- jstack pid 找到死鎖查看