Flink 學習 — Flink 中幾種 Time 詳解
阿新 • • 發佈:2021-06-17
話不多說,直接上程式碼:
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、對於資料庫鎖,加鎖和解鎖必須在同一個資料庫連線裡,否則出現解鎖失敗的情況