死鎖問題的出現和解決

2021-08-08 11:56:47 字數 3717 閱讀 4993

是指兩個或者兩個以上的執行緒在執行的過程中,因爭奪資源產生的一種互相等待的現象 

舉例: 

中國人、美國人吃飯案例

正常情況: 

中國人:筷子兩支 

美國人:刀和叉

現在: 

中國人:筷子一支,刀一把 

美國人:筷子一支,叉一把

產生死鎖問題: 

中國人拿著刀的同時等著美國人把另乙隻筷子給他,美國人拿著一支筷子的同時等著中國人把刀給他

//定義鎖物件

public

class

mylock

//定義thread類的run()方法

public

class

deadlock

extends

thread

@override

public

void run()

}}else}}

}}//測試用例

public

class

deadlockdemo

}

有乙個student類作為資源(鎖)

public

class student

模擬生產者-消費者模型: 

建立兩個執行緒物件,乙個是設定 student 屬性的執行緒 setthread ,另乙個是獲取 student 屬性的執行緒 getthread

public

class

setthread

implements

runnable

@override

public

void run() catch (interruptedexception e)

}if(x%2 == 0)else

x++;

//修改標記

st.flag = true;

//喚醒執行緒

st.notify();}}

}}public

class

getthread

implements

runnable

@override

public

void run() catch (interruptedexception e)

}system.out.println(st.name+"--------"+st.age);

//修改標記

st.flag = true;

//喚醒執行緒

st.notify();}}

}}

測試用例:

public

class studentdemo

}

執行結果:

...

紫霞仙子--------27

紫霞仙子--------27

紫霞仙子--------27

紫霞仙子--------27

紫霞仙子--------27

劉意--------30

劉意--------30

劉意--------30

劉意--------30

劉意--------30

...

存在問題:

a:生產者—先看看是否有資料,有就等待;沒有就生產,然後通知消費者進行消費

b:消費者—先看看是否有資料,有就消費,消費完通知生產者繼續生產;沒有就等待

object類中提供了3個方法:

wait():等待

notify():喚醒單個執行緒

notifyall():喚醒所有執行緒

問:wait和notify方法為什麼不定義在thread類上而是object類上呢?

這些方法的呼叫必須通過鎖物件來呼叫,而我們剛才使用的鎖物件是任意物件 

所以,這些方法必須定義在object類中。

方式2中,同樣也存在不適用的情況:一旦student類中的成員變數被private修飾符私有化,那麼其他thread類就無法直接訪問到其成員變數了。 

解決方法: 

student自己實現get和set方法,外部thread類直接呼叫其方法進行資料交換即可。

public

class

student catch (interruptedexception e)

}//設定資料

this.name = name;

this.age = age;

//修改標記並喚醒執行緒

this.flag = true;

this.notify();

}public

synchronized

void get() catch (interruptedexception e)

}//獲取資料

system.out.println(this.name +"---"+this.age);

//修改標記並喚醒執行緒

this.flag = false;

this.notify();

}}/**

* 生產者類

*@author llj

* */

public

class

setthread

implements

runnable

@override

public

void run() else

x++;}}

}/**

* 消費者類

*@author llj

* */

public

class

getthread

implements

runnable

@override

public

void run()

}}測試用例:

public

class

studentdemo

}

紫霞仙子--

-27劉意-

--30紫霞仙子--

-27劉意-

--30紫霞仙子--

-27劉意-

--30紫霞仙子--

-27劉意-

--30紫霞仙子--

-27劉意-

--30紫霞仙子--

-27劉意-

--30.

..

​​​​​​​總結

原因: 

執行緒執行的隨機性 

解決方法: 

加鎖,在乙個執行緒對共享資源操作的時候,其他執行緒只能等待該鎖釋放 

* 注意: a: 不同種類的執行緒都要加鎖 

b: 不同種類的執行緒加的鎖都必須是同一把

原因: 

cpu的一點點時間片執行時間,足以讓乙個執行緒中的**執行多次 

cpu執行程式時的隨機性 

解決方法: 

利用 等待 – 喚醒 機制,讓兩個執行緒交替執行

java基礎 26 死鎖問題的出現和解決

是指兩個或者兩個以上的執行緒在執行的過程中,因爭奪資源產生的一種互相等待的現象 舉例 中國人 美國人吃飯案例 正常情況 中國人 筷子兩支 美國人 刀和叉 現在 中國人 筷子一支,刀一把 美國人 筷子一支,叉一把 產生死鎖問題 中國人拿著刀的同時等著美國人把另乙隻筷子給他,美國人拿著一支筷子的同時等著...

查詢死鎖 和 解決死鎖

sql中執行 sp who lock kill 1 1 語句中查詢出來的id set ansi nulls on go set quoted identifier on go alter procedure dbo sp who lock as begin declare spid int decl...

死鎖原因,條件和解決

死鎖是指多個程序迴圈等待彼此占有的資源而無限期的僵持等待下去的局面。原因是 為使系統不發生死鎖,必須設法破壞產生死鎖的四個必要條件之一,或者允許死鎖產生,但當死鎖發生時能檢測出思索,並有能力實現恢復。一般有死鎖的預防 死鎖避免 死鎖的檢測與恢復三種方法。允許程序動態的申請資源,但系統在進行資源分配前...