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

2021-07-25 10:40:40 字數 4167 閱讀 4667

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

舉例:

中國人、美國人吃飯案例

正常情況:

中國人:筷子兩支

美國人:刀和叉

現在:

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

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

產生死鎖問題:

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

//定義鎖物件

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

...

發現結果並不是那麼理想,同一組資料出現多次

出現這種狀況的原因:

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

存在問題:

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高階基礎(75) 死鎖問題

例子 兩個人去就餐,但是只有一雙筷子。只有乙個人同時拿到兩隻筷子,才可以吃東西。兩個執行緒,分別持有不同的鎖,都需要獲取對方的鎖來執行自己的任務。在這個過程中,有可能會出現互不相讓的情況。死鎖是設計的bug,問題比較隱晦。不過死鎖造成的影響很少會立即顯現出來,乙個類可能發生死鎖,並不意味著每次都會發...

Java基礎 乙個死鎖問題

package cn.itcast 02 public class mylock package cn.itcast 02 public class dielock extends thread override public void run else package cn.itcast 02 同...

死鎖問題的出現和解決

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