麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > 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 | www亚洲免费 | 在线成人免费观看视频 | 美女很黄很黄免费的 | 91香蕉国产亚洲一区二区三区 | 国产98色在线 | 中文日韩在线视频 | 美女一级视频 | 黄色aaa视频 | 大号bbwassbigav头交 | 国产成人综合在线观看 | 9191色| 精品亚洲夜色av98在线观看 | 视频一区二区中文字幕 | 天天色图片 | 久久久久久久久久久国产精品 | 亚洲第一成人在线视频 | 成人在线观看小视频 | 日本在线视频一区二区三区 | 久久久久久麻豆 | 国产精品爆操 | 日本黄色一级电影 | 免费视频www在线观看 | av在线直播观看 | 欧美成人午夜影院 | 久久不射电影 | 精品国产中文字幕 | 一级一级一级毛片 | 91精品久久久久久久 | 日本欧美一区二区三区在线播 | 毛片在线免费观看完整版 | 369看片你懂的小视频在线观看 | 日本中文字幕电影在线观看 | 在线播放免费人成毛片乱码 | 2021国产精品视频 | 午夜天堂在线 | 99热99精品 | 国产精品久久久久久久四虎电影 | 亚洲日本韩国精品 | 91成人在线免费观看 | 91一区二区三区久久久久国产乱 |