乙個多執行緒死鎖案例,如何避免及解決死鎖問題?

2021-09-29 13:34:33 字數 774 閱讀 1504

private static object lock1 = new object();

private static object lock2 = new object();

public static void main(string args)catch (interruptedexception e)

synchronized (lock2)

}system.out.println("thread1 end");

}}.start();

new thread()catch (interruptedexception e)

synchronized (lock1)

}system.out.println("thread2 end");

}}.start();

}

輸出

thread1 get lock1

thread2 get lock2

兩個執行緒相互得到鎖1,鎖2,然後執行緒1等待執行緒2釋放鎖2,執行緒2等待執行緒1釋放鎖1,兩者各不相互,這樣形成死鎖。

那麼如何避免和解決死鎖問題呢?

1、按順序加鎖

上個例子執行緒間加鎖的順序各不一致,導致死鎖,如果每個執行緒都按同乙個的加鎖順序這樣就不會出現死鎖。

2、獲取鎖時限

每個獲取鎖的時候加上個時限,如果超過某個時間就放棄獲取鎖之類的。

3、死鎖檢測

按執行緒間獲取鎖的關係檢測線程間是否發生死鎖,如果發生死鎖就執行一定的策略,如終斷線程或回滾操作等。

乙個模擬死鎖的多執行緒

package org.kevinlifeng public class testdeadlock implements runnable catch interruptedexception e t1嘗試鎖o2 可o2 已經被t2 給鎖住了還沒釋放,一直等待 synchronized o2 到了這...

JAVA多執行緒的乙個簡單案例

只有四個類,前面三個介紹執行緒的休眠喚醒以及結束 最後乙個類是乙個單獨的小例子 建議先看最後的在看前面的 package com.imooc.concurrent.base 隋唐演義大戲舞台 public class stage extends thread catch interruptedexc...

Java多執行緒 手寫乙個死鎖的例子

下面是乙個多執行緒死鎖的例子 public class deadlockdemo private void deadlock catch interruptedexception e synchronized lock2 system.out.println thread1 end thread t...