死鎖
話不多說,直接上代碼:
1 public class DeadlockTest { 2 private static final Object o1 = new Object(); 3 private static final Object o2 = new Object(); 4 5 public static void main(String[] args) { 6 new Thread(new Runnable() { 7 public void run() { 8 for (; ; ) { 9 synchronized (o1) { 10 System.out.println("A線程獲取o1鎖"); 11 synchronized (o2) { 12 System.out.println("繼續執行要持有o2鎖"); 13 } 14 } 15 } 16 } 17 }, "A").start(); 18 new Thread(new Runnable() { 19 public void run() { 20 for (; ; ) { 21 synchronized (o2){ 22 System.out.println("B線程獲取o2鎖"); 23 synchronized (o1){ 24 System.out.println("繼續執行要持有o1鎖"); 25 } 26 } 27 } 28 } 29 }, "B").start(); 30 } 31 }

通過jconsole分析工具可以看到確實存在死鎖情況,B鎖被A線程持有,A鎖被B線程持有,線程A和線程B相互等待對方所持有鎖的釋放,而導致系統不能繼續運行下去
那么,在我們實際做項目時候,如何避免死鎖的發生呢?
1、避免一個線程同時獲取多個鎖
2、避免一個線程在鎖內同時占用多個資源,盡量保證每個鎖只占用一個資源
3、嘗試使用定時鎖,使用lock.tryLock(timeout);來代替使用內部鎖機制
4、對于數據庫鎖,加鎖和解鎖必須在同一個數據庫連接里,否則出現解鎖失敗的情況

浙公網安備 33010602011771號