您好,登錄后才能下訂單哦!
這篇文章主要介紹Java多線程中死鎖有什么用,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
所謂線程死鎖是指兩個或兩個以上的線程互相持有對方所需要的資源,由于synchronized的特性,一個線程持有一個資源,或者說獲得一個鎖,在該線程釋放這個鎖之前,其它線程是獲取不到這個鎖的,而且會一直死等下去,因此這便造成了死鎖。
如下圖(1-1):
Java多線程中死鎖產(chǎn)生的必要條件如下:
1.互斥條件:一個資源,或者說一個鎖只能被一個線程所占用,當一個線程首先獲取到這個鎖之后,
在該線程釋放這個鎖之前,其它線程均是無法獲取到這個鎖的;
2.占有且等待:一個線程已經(jīng)獲取到一個鎖,再獲取另一個鎖的過程中,即使獲取不到也不會釋放已
經(jīng)獲得的鎖;
3.不可剝奪條件:任何一個線程都無法強制獲取別的線程已經(jīng)占有的鎖;
4.循環(huán)等待條件:線程A拿著線程B的鎖,線程B拿著線程A的鎖;
當滿足以上四個條件時,就出現(xiàn)死鎖的情況?。?!
public class DeadLock implements Runnable {
//創(chuàng)建兩個鎖對象
private Object lock1=new Object();
private Object lock2=new Object();
@Override
public void run(){
while(true){
method1();
method2();
}
}
public void method1(){
synchronized (lock1){
System.out.println(Thread.currentThread().getName() + “獲取到lock1”);
try {
Thread.sleep(1000); //線程休眠,使得CPU切換
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2){
System.out.println(Thread.currentThread().getName() + "獲取到lock2");
}
}
}
public void method2(){
synchronized (lock2){
System.out.println(Thread.currentThread().getName() + "獲取到lock2");
synchronized (lock1){
System.out.println(Thread.currentThread().getName() + "獲取到lock1");
}
}
}
public static void main(String[] args) {
DeadLock deadLock = new DeadLock();
new Thread(deadLock).start();
new Thread(deadLock).start();
}
}
(圖3-1)
這樣便造成了死鎖,Thread1拿著lock1,想要lock2,Thread2拿著lock2,想要lock1.
Java多線程中如何避免死鎖:
1.加鎖順序:線程按照相同的順序加鎖。
2.加鎖時限,線程獲取鎖的過程中限制一定的時間,如果給定時間內獲取不到,就算了,別勉強自
己。這需要用到Lock的一些API
在發(fā)生死鎖之后,程序就卡住了沒有任何反應,但程序仍在運行,因此需要借助一些
1.首先使用 jps -l 顯示正在運行的虛擬機進程,并顯示虛擬機執(zhí)行主類(main函數(shù)所在
的類)名稱以及這些進程的本地虛擬機唯一ID
圖(5-1)
2.使用 jstack + id 進行跟蹤排查
圖(5-2)
圖(5-3)
以上是“Java多線程中死鎖有什么用”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。