答:同步中巢狀同步,導致鎖無法釋放
class threadtrain6 implements runnable
}} else
} }public synchronized void sale() catch (exception e)
system.out.println(thread.currentthread().getname() + ",** 第" + (100 - traincount + 1) + "張票.");
traincount--;
}} }
}public class deadlockthread
}
死鎖(deadlock)
①死鎖概述
執行緒死鎖是指兩個或兩個以上的執行緒互相持有對方所需要的資源,由於synchronized的特性,乙個執行緒持有乙個資源,或者說獲得乙個鎖,在該執行緒釋放這個鎖之前,其它執行緒是獲取不到這個鎖的,而且會一直死等下去,因此這便造成了死鎖。
②死鎖產生的條件
互斥條件:乙個資源,或者說乙個鎖只能被乙個執行緒所占用,當乙個執行緒首先獲取到這個鎖之後,在該執行緒釋放這個鎖之前,其它執行緒均是無法獲取到這個鎖的。
請求和保持條件:乙個執行緒已經獲取到乙個鎖,再獲取另乙個鎖的過程中,即使獲取不到也不會釋放已經獲得的鎖。
不可剝奪條件:任何乙個執行緒都無法強制獲取別的執行緒已經占有的鎖
迴圈等待條件:執行緒a拿著執行緒b的鎖,執行緒b拿著執行緒a的鎖。。
③如何避免死鎖
避免多次鎖定。盡量避免同乙個執行緒對多個 lock 進行鎖定。例如上面的死鎖程式,主線程要對 a、b 兩個物件的 lock 進行鎖定,副執行緒也要對 a、b 兩個物件的 lock 進行鎖定,這就埋下了導致死鎖的隱患。
具有相同的加鎖順序。如果多個執行緒需要對多個 lock 進行鎖定,則應該保證它們以相同的順序請求加鎖。比如上面的死鎖程式,主線程先對 a 物件的 lock 加鎖,再對 b 物件的 lock 加鎖;而副執行緒則先對 b 物件的 lock 加鎖,再對 a 物件的 lock 加鎖。這種加鎖順序很容易形成巢狀鎖定,進而導致死鎖。如果讓主線程、副執行緒按照相同的順序加鎖,就可以避免這個問題。
使用定時鎖。程式在呼叫 acquire() 方法加鎖時可指定 timeout 引數,該引數指定超過 timeout 秒後會自動釋放對 lock 的鎖定,這樣就可以解開死鎖了。
死鎖檢測。死鎖檢測是一種依靠演算法機制來實現的死鎖預防機制,它主要是針對那些不可能實現按序加鎖,也不能使用定時鎖的場景的。
多執行緒死鎖
這段時間剛好學到多執行緒,下面是自己對死鎖的一些感悟,並不是我說的有多到位,只是想到一種更為通俗易懂理解方式,現在和大家一起分享一下,有改進的地方,希望大家多提提意見。一 首先說一下死鎖的定義 由兩個或兩個以上的執行緒由於互相競爭資源,導致一種互相等待的狀態,如果沒有外力推動,則他們都無法進行下去。...
多執行緒死鎖
1 提出 多執行緒與多程序提高了系統資源的利用率,然而併發執行也會帶來一些問題,如死鎖。2 概念 死鎖是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖...
多執行緒死鎖
演示一種死鎖的現象 實現如圖所示的死鎖 public classdeadlockimplementsrunnable else count 解釋 死鎖 cpu程序排程是隨機的,執行緒a執行,列印了幾遍if else,這中間,count為奇數,而且執行緒2搶奪了cpu 資源進入else,而此時如果缺少...