1. 程式人生 > 其它 >Flink 學習 — Flink 中幾種 Time 詳解

Flink 學習 — Flink 中幾種 Time 詳解

話不多說,直接上程式碼:

 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、對於資料庫鎖,加鎖和解鎖必須在同一個資料庫連線裡,否則出現解鎖失敗的情況