亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java中常見死鎖與活鎖的實例詳解

2024-07-14 08:42:56
字體:
來源:轉載
供稿:網友

本文介紹了Java中常見死鎖與活鎖的實例詳解,分享給大家,具體如下:

  • 順序死鎖:過度加鎖,導致由于執行順序的原因,互相持有對方正在等待的鎖
  • 資源死鎖:多個線程在相同的資源上發生等待

由于調用順序而產生的死鎖

public class Test {  Object leftLock = new Object();  Object rightLock = new Object();  public static void main(String[] args) {    final Test test = new Test();    Thread a = new Thread(new Runnable() {      @Override      public void run() {        int i=0;        while (i<10)        {          test.leftRight();          i++;        }      }    },"aThread");    Thread b = new Thread(new Runnable() {      @Override      public void run() {        int i=0;        while (i<10)        {          test.rightleft();          i++;        }      }    },"bThread");    a.start();    b.start();  }  public void leftRight(){    synchronized (leftLock){      System.out.println(Thread.currentThread().getName()+":leftRight:get left");      synchronized (rightLock){        System.out.println(Thread.currentThread().getName()+":leftRight:get right");      }    }  }  public void rightleft(){    synchronized (rightLock){      System.out.println(Thread.currentThread().getName()+":rightleft: get right");      synchronized (leftLock){        System.out.println(Thread.currentThread().getName()+":rightleft: get left");      }    }  }}

運行后輸出如下

aThread:leftRight:get left
bThread:rightleft: get right

可以通過jstack發現死鎖的痕跡

"bThread" prio=5 tid=0x00007fabb2001000 nid=0x5503 waiting for monitor entry [0x000000011d54b000]  java.lang.Thread.State: BLOCKED (on object monitor)  at main.lockTest.Test.rightleft(Test.java:52)  - waiting to lock <0x00000007aaee5748> (a java.lang.Object)  - locked <0x00000007aaee5758> (a java.lang.Object)  at main.lockTest.Test$2.run(Test.java:30)  at java.lang.Thread.run(Thread.java:745)  Locked ownable synchronizers:  - None"aThread" prio=5 tid=0x00007fabb2801000 nid=0x5303 waiting for monitor entry [0x000000011d448000]  java.lang.Thread.State: BLOCKED (on object monitor)  at main.lockTest.Test.leftRight(Test.java:43)  - waiting to lock <0x00000007aaee5758> (a java.lang.Object)  - locked <0x00000007aaee5748> (a java.lang.Object)  at main.lockTest.Test$1.run(Test.java:19)  at java.lang.Thread.run(Thread.java:745)  Locked ownable synchronizers:  - None

可以看到bThread持有鎖0x00000007aaee5758,同時等待0x00000007aaee5748,然而恰好aThread持有鎖0x00000007aaee5748并等待0x00000007aaee5758,從而形成了死鎖

線程饑餓死鎖

public class ExecutorLock {  private static ExecutorService single=Executors.newSingleThreadExecutor();  public static class AnotherCallable implements Callable<String>{    @Override    public String call() throws Exception {      System.out.println("in AnotherCallable");      return "annother success";    }  }  public static class MyCallable implements Callable<String>{    @Override    public String call() throws Exception {      System.out.println("in MyCallable");      Future<String> submit = single.submit(new AnotherCallable());      return "success:"+submit.get();    }  }  public static void main(String[] args) throws ExecutionException, InterruptedException {    MyCallable task = new MyCallable();    Future<String> submit = single.submit(task);    System.out.println(submit.get());    System.out.println("over");    single.shutdown();  }}

執行的輸出只有一行

in MyCallable

通過jstack觀察可以看到如下

"main" prio=5 tid=0x00007fab3f000000 nid=0x1303 waiting on condition [0x0000000107d63000]  java.lang.Thread.State: WAITING (parking)  at sun.misc.Unsafe.park(Native Method)  - parking to wait for <0x00000007aaeed1d8> (a java.util.concurrent.FutureTask)  at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)  at java.util.concurrent.FutureTask.awaitDone(FutureTask.java:425)  at java.util.concurrent.FutureTask.get(FutureTask.java:187)  at main.lockTest.ExecutorLock.main(ExecutorLock.java:32)  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  at java.lang.reflect.Method.invoke(Method.java:606)  at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)  Locked ownable synchronizers:  - None.."pool-1-thread-1" prio=5 tid=0x00007fab3f835800 nid=0x5303 waiting on condition [0x00000001199ee000]  java.lang.Thread.State: WAITING (parking)  at sun.misc.Unsafe.park(Native Method)  - parking to wait for <0x00000007ab0f8698> (a java.util.concurrent.FutureTask)  at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)  at java.util.concurrent.FutureTask.awaitDone(FutureTask.java:425)  at java.util.concurrent.FutureTask.get(FutureTask.java:187)  at main.lockTest.ExecutorLock$MyCallable.call(ExecutorLock.java:26)  at main.lockTest.ExecutorLock$MyCallable.call(ExecutorLock.java:20)  at java.util.concurrent.FutureTask.run(FutureTask.java:262)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)  at java.lang.Thread.run(Thread.java:745)  Locked ownable synchronizers:  - <0x00000007aaeed258> (a java.util.concurrent.ThreadPoolExecutor$Worker)

主線程在等待一個FutureTask完成,而線程池中一個線程也在等待一個FutureTask完成。 
從代碼實現可以看到,主線程往線程池中扔了一個任務A,任務A又往同一個線程池中扔了一個任務B,并等待B的完成,由于線程池中只有一個線程,這將導致B會被停留在阻塞隊列中,而A還得等待B的完成,這也就是互相等待導致了死鎖的反生

這種由于正在執行的任務線程都在等待其它工作隊列中的任務而阻塞的現象稱為 線程饑餓死鎖

活鎖

并未產生線程阻塞,但是由于某種問題的存在,導致無法繼續執行的情況。

1、消息重試。當某個消息處理失敗的時候,一直重試,但重試由于某種原因,比如消息格式不對,導致解析失敗,而它又被重試

這種時候一般是將不可修復的錯誤不要重試,或者是重試次數限定

2、相互協作的線程彼此響應從而修改自己狀態,導致無法執行下去。比如兩個很有禮貌的人在同一條路上相遇,彼此給對方讓路,但是又在同一條路上遇到了?;ハ嘀g反復的避讓下去

這種時候可以選擇一個隨機退讓,使得具備一定的隨機性

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲伊人久久大香线蕉av| 日韩福利在线播放| 中文字幕亚洲一区在线观看| 91po在线观看91精品国产性色| 久久成人18免费网站| 精品国产依人香蕉在线精品| 久久91亚洲精品中文字幕| 欧美性生活大片免费观看网址| 亚洲黄一区二区| 亚洲成人黄色在线| 国产精品99蜜臀久久不卡二区| 911国产网站尤物在线观看| 国产成人福利网站| 国产精品亚洲第一区| 日韩欧美国产网站| 亚洲日本aⅴ片在线观看香蕉| 国产亚洲欧洲高清一区| 88xx成人精品| 久久久久五月天| 日韩精品中文字| 日韩视频免费大全中文字幕| 91亚洲一区精品| 久久精品欧美视频| 欧美成人黄色小视频| 欧美福利在线观看| 亚洲国产精品久久久久久| 国产精品中文字幕在线| 色中色综合影院手机版在线观看| 亚洲午夜av久久乱码| 丰满岳妇乱一区二区三区| 国产69精品久久久| 81精品国产乱码久久久久久| 精品福利视频导航| 欧美中文字幕在线观看| 亚洲专区中文字幕| 狠狠躁夜夜躁久久躁别揉| 久久伊人色综合| 日韩国产在线看| 欧美成人午夜免费视在线看片| 国产69精品久久久久9999| 两个人的视频www国产精品| 最新91在线视频| 欧美精品免费在线| 亚洲乱码国产乱码精品精天堂| 色老头一区二区三区| 亚洲色图欧美制服丝袜另类第一页| 久久免费视频网| 久久久久久久亚洲精品| 日韩禁在线播放| 米奇精品一区二区三区在线观看| 91免费电影网站| 成人免费大片黄在线播放| 亚洲精品中文字幕av| 中文国产成人精品久久一| 国产一区二区三区直播精品电影| 久久手机免费视频| 亚洲毛茸茸少妇高潮呻吟| 精品久久久久久久久久久久久| 精品久久久久久中文字幕| 成人精品福利视频| 日本电影亚洲天堂| 国产欧美日韩综合精品| 91情侣偷在线精品国产| 国产精自产拍久久久久久蜜| 亚洲人午夜精品免费| 亚洲aaa激情| 一本色道久久88亚洲综合88| 中文字幕在线看视频国产欧美| 成人妇女免费播放久久久| 日韩精品久久久久久久玫瑰园| 精品在线观看国产| www.欧美精品一二三区| 亚洲精品自拍视频| 亚洲欧美www| 欧美高清视频免费观看| 亚洲国产精品va在线观看黑人| 国产精品丝袜久久久久久不卡| 欧美亚洲视频一区二区| 日韩欧美一区视频| 久久影视电视剧凤归四时歌| 日韩福利在线播放| 欧美大码xxxx| 91色琪琪电影亚洲精品久久| 超碰精品一区二区三区乱码| 国产精品一区二区av影院萌芽| 欧美视频一区二区三区…| 美女精品久久久| 亚洲精品丝袜日韩| 2020久久国产精品| 91精品久久久久久久久| 黄色一区二区在线| 亚洲影院污污.| 亚洲欧美日韩成人| 精品成人久久av| 国产精品美女久久| 在线日韩欧美视频| 欧美与欧洲交xxxx免费观看| 欧美国产精品人人做人人爱| 日韩成人在线观看| 久热在线中文字幕色999舞| 中文字幕精品一区久久久久| 日韩高清欧美高清| 一区二区三区 在线观看视| 亚洲第一区中文99精品| 中文欧美日本在线资源| 亚洲一区精品电影| 91精品综合久久久久久五月天| 亚洲第一视频在线观看| 国内精品一区二区三区| 色99之美女主播在线视频| 欧美视频专区一二在线观看| 91av在线国产| 久久综合亚洲社区| 69国产精品成人在线播放| 欧美性猛交xxxx免费看漫画| 亚洲免费一级电影| 日韩经典一区二区三区| 国产视频自拍一区| 日韩不卡在线观看| 亚洲激情国产精品| 国产精品久久久久久久一区探花| 国产精品欧美亚洲777777| 国产精品流白浆视频| 久久韩剧网电视剧| 亚洲成色www8888| 日韩在线视频中文字幕| 日韩国产欧美精品在线| 国产精品美女主播| 精品福利樱桃av导航| 日韩a**中文字幕| 伊人久久综合97精品| 久久久久久网址| 日韩av在线免费观看| 亚洲美女视频网| 成人激情视频在线| 成人在线视频网站| 亚洲视频专区在线| 色爱av美腿丝袜综合粉嫩av| 亚洲人成欧美中文字幕| 国产精品视频在线播放| 欧美日韩亚洲视频一区| 日韩av在线网站| 亚洲精品免费一区二区三区| 欧美人与物videos| 91在线观看免费网站| 日韩中文娱乐网| 成人激情视频小说免费下载| 国产精品热视频| 91久久精品美女高潮| 久久视频免费在线播放| 欧美电影免费观看网站| 久久久久久一区二区三区| 清纯唯美日韩制服另类| 国产精品成人在线| 在线观看成人黄色| 欧美午夜性色大片在线观看| 97成人在线视频| 亚洲一区制服诱惑| 97久久精品在线| 亚洲免费高清视频| 日韩中文字幕视频在线| 一色桃子一区二区| 欧美人与物videos| 中文字幕亚洲综合久久筱田步美|