的概念
“死鎖”指的是:
多個線程各自占有一些共享資源悲酷,并且互相等待其他線程占有的資源才能進行褐澎,而導致兩個或者多個線程都在等待對方釋放資源,都停止執(zhí)行的情形溜嗜。
因此柴底,?某一個同步塊需要同時擁有“兩個以上對象的鎖”時,就可能會發(fā)生“死鎖”的問題粱胜。下面案例中,“化妝線程”需要同時擁有“鏡子對象”狐树、“口紅對象”才能運行同步塊焙压。那么,實際運行時抑钟,“小丫的化妝線程”擁有了“鏡子對象”涯曲,“大丫的化妝線程”擁有了“口紅對象”,都在互相等待對方釋放資源在塔,才能化妝幻件。這樣,兩個線程就形成了互相等待蛔溃,無法繼續(xù)運行的“死鎖狀態(tài)”绰沥。?
【示例1】死鎖示例
class?Lipstick{
}
class?Mirror{
}
class?Makeup?extends?Thread {
????int?flag;
??? String girl;
????static?Lipstick?lipstick=new?Lipstick();
????static?Mirror?mirror=?new?Mirror();
??? @Override
????public?void?run() {
?????? //?TODO?Auto-generated method stub
?????? doMakeup();
??? }
????void?doMakeup(){
???????if(flag==0){
???????????synchronized?(lipstick) {
????????????? System.out.println(girl+"拿著口紅!");
??????????????try?{
????????????????? Thread.sleep(1000);
????????????? }?catch?(InterruptedException e) {
????????????????? e.printStackTrace();
????????????? }
??????????????synchronized?(mirror) {
????????????????? System.out.println(girl+"拿著鏡子贺待!");
????????????? }
?????????? }
?????? }
???????else{
???????????synchronized?(mirror) {
????????????? System.out.println(girl+"拿著鏡子徽曲!");
??????????????try?{
????????????????? Thread.sleep(2000);
????????????? }?catch?(InterruptedException e) {
????????????????? e.printStackTrace();
????????????? }
??????????????synchronized?(lipstick) {
????????????????? System.out.println(girl+"拿著口紅!");
????????????? }
?????????? }
?????? }
??? }
}
public?class?TestDeadLock {
????public?static?void?main(String[] args) {
?????? Makeup m1 =?new?Makeup();? m1.girl="大丫"; m1.flag=0;
?????? Makeup m2 =?new?Makeup();? m2.girl="小丫"; m2.flag=1;
?????? m1.start();
?????? m2.start();
??? }
}
??圖1?線程互相等待“資源”而處于“停滯”狀態(tài)
死鎖的解決方法
死鎖是由于“同步塊需要同時持有多個對象鎖造成”的麸塞,要解決這個問題秃臣,思路很簡單,就是:
同一個代碼塊哪工,不要同時持有兩個對象鎖奥此。?
如上面的死鎖案例,修改成示例2所示雁比。
?【示例2】死鎖問題的解決(修改示例1中doMakeup方法)
????void?doMakeup(){
???????if(flag==0){
???????????synchronized?(lipstick) {
????????????? System.out.println(girl+"拿著口紅稚虎!");
??????????????try?{
????????????????? Thread.sleep(1000);
????????????? }?catch?(InterruptedException e) {
????????????????? e.printStackTrace();
????????????? }
?????????? }
???????????synchronized?(mirror) {
????????????? System.out.println(girl+"拿著鏡子!");
?????????? }
?????? }
???????else{
???????????synchronized?(mirror) {
????????????? System.out.println(girl+"拿著鏡子偎捎!");
??????????????try?{
????????????????? Thread.sleep(2000);
????????????? }?catch?(InterruptedException e) {
????????????????? e.printStackTrace();
????????????? }
?????????? }
???????????synchronized?(lipstick) {
????????????? System.out.println(girl+"拿著口紅祥绞!");
?????????? }
?????? }
??? }
示例2?運行效果圖
示例2?運行效果圖
「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G鸭限,10年Java研發(fā)經驗蜕径,曾在神州數(shù)碼、航天院某所研發(fā)中心從事軟件設計及研發(fā)工作败京,從小白逐漸做到工程師兜喻、高級工程師、架構師赡麦。精通Java平臺軟件開發(fā)朴皆,精通JAVAEE帕识,熟悉各種流行開發(fā)框架。
?筆記包含從淺入深的六大部分:
?A-Java入門階段
?B-數(shù)據(jù)庫從入門到精通
?C-手刃移動前端和Web前端
?D-J2EE從了解到實戰(zhàn)
?E-Java高級框架精解
?F-Linux和Hadoop?