Java——多线程(死锁)
生活随笔
收集整理的這篇文章主要介紹了
Java——多线程(死锁)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
死鎖是指:兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過(guò)程中,由于競(jìng)爭(zhēng)資源或者由于彼此通信而造成的一種阻塞的現(xiàn)象,若無(wú)外力作用,它們都將無(wú)法推進(jìn)下去。此時(shí)稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等待的進(jìn)程稱為死鎖進(jìn)程。
同步代碼塊不要嵌套,因?yàn)?#xff0c;嵌套容易死鎖,避免死鎖的出現(xiàn),不要進(jìn)行同步代碼塊的嵌套
package com.yy.syn; //只有獲得到一雙筷子才可以吃 public class Demo5_DeadLock {private static String s1 = "筷子1";private static String s2 = "筷子2";public static void main(String[] args) {new Thread(){ //第一個(gè)線程Thread-0,在上面,所以,它先開(kāi)啟,先開(kāi)始執(zhí)行,執(zhí)行的機(jī)會(huì)多public void run(){while(true){synchronized (s1) { //系統(tǒng)先拿到s1System.out.println(getName() + "...獲取" + s1 + "等待" + s2 );//之后,執(zhí)行這句話synchronized (s2) { //正準(zhǔn)備獲取s2的時(shí)候,第二條線程啟動(dòng)System.out.println(getName() + "...拿到" + s2 +"開(kāi)吃" );}}}}}.start();new Thread(){public void run(){while(true){synchronized (s2) { //第二條線程獲取到s2System.out.println(getName() + "...獲取" + s2 + "等待" + s1 );//之后,執(zhí)行這句話synchronized (s1) { //然后,再準(zhǔn)備去獲取s1,但是s1已經(jīng)被第一條線程獲取,第一條線程并未釋放s1System.out.println(getName() + "...拿到" + s1 +"開(kāi)吃" );}}}}}.start();} } //之后,第一條線程獲得了s1,第二條線程獲取了s2,第一條線程想獲取s2,但是,s2被第二條線程所獲取,而第二條線程想獲取s1,但是s1被第一條線程所獲取,所以,兩條線程開(kāi)始僵持,最后造成死鎖 //但是,也會(huì)有一種發(fā)生概率極低的情況,一種理想狀態(tài),即 第一條線程先拿到s1然后輸出一句話,然后再拿到s2輸出一句話,然后再釋放s1,釋放s2;然后,第二條線程開(kāi)始獲取s2,輸出,然后再獲取s1,輸出 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Java——多线程(死锁)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 会议平板跟投影仪哪个好一点,最近公司想购
- 下一篇: Java——多线程(线程安全问题)