欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

java多線程中死鎖情況的一個(gè)示例 - 新聞資訊 - 云南小程序開(kāi)發(fā)|云南軟件開(kāi)發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開(kāi)發(fā)/軟件開(kāi)發(fā)

知識(shí)

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X(jué)表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!

您當(dāng)前位置>首頁(yè) » 新聞資訊 » 技術(shù)分享 >

java多線程中死鎖情況的一個(gè)示例

發(fā)表時(shí)間:2020-10-19

發(fā)布人:葵宇科技

瀏覽次數(shù):49


    下面是逝世鎖情況的一個(gè)示例代碼
package com.qust.demo.money;

class A {

	public synchronized void foo(B b) {
		System.out.println(Thread.currentThread().getName() + " 進(jìn)入A的foo");
		try {
			Thread.sleep(200);
		} catch (InterruptedException ex) {
			ex.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName() + " 試圖調(diào)用B的last");
		b.last();
	}

	public synchronized void last() {
		System.out.println("A的last()");
	}
}

class B {

	public synchronized void bar(A a) {
		System.out.println(Thread.currentThread().getName() + " 進(jìn)入B的bar");
		try {
			Thread.sleep(200);
		} catch (InterruptedException ex) {
			ex.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName() + " 試圖調(diào)用A的last");
		a.last();
	}

	public synchronized void last() {
		System.out.println("B的last()");
	}
}

public class DeadLock implements Runnable {

	A a = new A();
	B b = new B();

	public void init() {
		Thread.currentThread().setName("主線程");
		System.out.println("進(jìn)入主線程");
		a.foo(b);
	}

	public void run() {
		Thread.currentThread().setName("副線程");
		System.out.println("進(jìn)入副線程");
		b.bar(a);
	}

	public static void main(String[] args) {
		DeadLock dl = new DeadLock();
		new Thread(dl).start();
		dl.init();
	}
}

    下面是運(yùn)行結(jié)不雅
進(jìn)入主線程
進(jìn)入副線程
主線程 進(jìn)入A的foo
副線程 進(jìn)入B的bar
副線程 試圖調(diào)用A的last
主線程 試圖調(diào)用B的last

    我們看到,正常情況下,最后還應(yīng)當(dāng)打印出“A的last()”和"B的last()",然則因?yàn)榫€程逝世鎖的原因,所以法度榜樣一向在等待履行,沒(méi)能正常的履行下去。
    在膳綾擎的代率攀瑯綾擎,為什么會(huì)出現(xiàn)逝世鎖這種情況呢?我們來(lái)簡(jiǎn)單分析一下。
    起首固然副線程的start()是在主線程的init()之前,然則因?yàn)槎嗑€程開(kāi)啟也須要一段時(shí)光,所以我們可以看到,是主線程的init()辦法履行在前,然后在init()瑯綾擎調(diào)用了a.foo()。A類和B類中的辦法都是同步辦法,是以,A的對(duì)象和B的對(duì)象都是同步鎖。在進(jìn)入A的foo()之前,線程會(huì)對(duì)A加鎖,然后線程睡眠200ms,這時(shí)刻副線程調(diào)用B的bar(),同樣的會(huì)對(duì)B加鎖,然后睡眠200ms。這時(shí)刻,主線程喚醒,試圖調(diào)用B的bar辦法,因?yàn)槭峭睫k法,所以須要對(duì)B加鎖,然則這時(shí)刻B已經(jīng)被副線程鎖住了,所以主線程就一向處于壅塞狀況。當(dāng)副線程喚醒的時(shí)刻,試圖調(diào)用A的同步辦法,同樣須要對(duì)A加鎖,然則這時(shí)刻主線程持有A的鎖,并處于壅塞狀況,所以副線程也不克不及向下履行,大年夜家都在等著對(duì)方釋放鎖,是以出現(xiàn)了我們膳綾擎說(shuō)的逝世鎖的情況。
    如不雅我們把A和B的last()的synchronized去掉落,那么法度榜樣在調(diào)用last()之前就不須要對(duì)對(duì)象進(jìn)行加鎖,也就不會(huì)出現(xiàn)逝世鎖的情況。
    因?yàn)樵诠ぷ髦羞€沒(méi)有碰到這種情況,所以只能拿這個(gè)實(shí)例法度榜樣講解了。

相關(guān)案例查看更多