知識(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í)提供便捷的支持!
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)案例查看更多
相關(guān)閱讀
- 云南省建設(shè)廳網(wǎng)站
- 小程序商城
- 云南網(wǎng)站建設(shè)方法
- 花農(nóng)小程序
- 網(wǎng)站建設(shè)靠譜公司
- 北京小程序開(kāi)發(fā)
- 云南網(wǎng)站建設(shè)特性
- 云南電商網(wǎng)站建設(shè)
- 昆明網(wǎng)站制作
- 云南網(wǎng)絡(luò)公司
- 曲靖小程序開(kāi)發(fā)
- 網(wǎng)絡(luò)公司電話
- 昆明小程序哪家好
- 云南網(wǎng)站建設(shè)案例
- 軟件定制
- 用戶登錄
- 汽車(chē)報(bào)廢系統(tǒng)
- 網(wǎng)站小程序
- 昆明小程序定制開(kāi)發(fā)
- 網(wǎng)站沒(méi)排名
- 小程序被攻擊
- 云南軟件設(shè)計(jì)
- 日歷組件
- 文山小程序開(kāi)發(fā)
- 網(wǎng)絡(luò)公司
- 麗江小程序開(kāi)發(fā)
- 云南軟件定制
- 全國(guó)前十名小程序開(kāi)發(fā)公司
- 云南小程序開(kāi)發(fā)公司推薦
- 云南網(wǎng)站建設(shè)公司排名