欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中常見死鎖與活鎖的實(shí)例詳解

 更新時間:2018年11月26日 11:37:20   作者:爬蜥  
這篇文章主要介紹了Java中常見死鎖與活鎖的實(shí)例詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

由于調(diào)用順序而產(chǎn)生的死鎖

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");
      }
    }
  }

}

運(yùn)行后輸出如下

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

可以通過jstack發(fā)現(xiàn)死鎖的痕跡

"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();
  }
}

執(zhí)行的輸出只有一行

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完成。
從代碼實(shí)現(xiàn)可以看到,主線程往線程池中扔了一個任務(wù)A,任務(wù)A又往同一個線程池中扔了一個任務(wù)B,并等待B的完成,由于線程池中只有一個線程,這將導(dǎo)致B會被停留在阻塞隊(duì)列中,而A還得等待B的完成,這也就是互相等待導(dǎo)致了死鎖的反生

這種由于正在執(zhí)行的任務(wù)線程都在等待其它工作隊(duì)列中的任務(wù)而阻塞的現(xiàn)象稱為 線程饑餓死鎖

活鎖

并未產(chǎn)生線程阻塞,但是由于某種問題的存在,導(dǎo)致無法繼續(xù)執(zhí)行的情況。

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

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

2、相互協(xié)作的線程彼此響應(yīng)從而修改自己狀態(tài),導(dǎo)致無法執(zhí)行下去。比如兩個很有禮貌的人在同一條路上相遇,彼此給對方讓路,但是又在同一條路上遇到了?;ハ嘀g反復(fù)的避讓下去

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • HashMap之keyset()方法底層原理解讀

    HashMap之keyset()方法底層原理解讀

    這篇文章主要介紹了HashMap之keyset()方法底層原理解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 詳解Java數(shù)據(jù)結(jié)構(gòu)之平衡二叉樹

    詳解Java數(shù)據(jù)結(jié)構(gòu)之平衡二叉樹

    平衡二叉樹(Balanced?Binary?Tree)又被稱為AVL樹(有別于AVL算法),且具有以下性質(zhì):它是一?棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,并且左右兩個子樹都是一棵平衡二叉樹。本文將詳解介紹一下平衡二叉樹的原理與實(shí)現(xiàn),需要的可以參考一下
    2022-02-02
  • java中使用dom4j解析XML文件的方法教程

    java中使用dom4j解析XML文件的方法教程

    在最近的開發(fā)中用到了dom4j來解析xml文件,所以便有了這篇文章,本文主要給大家介紹了關(guān)于java中使用dom4j解析XML文件的方法教程,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09
  • Spring導(dǎo)入properties配置文件代碼示例

    Spring導(dǎo)入properties配置文件代碼示例

    這篇文章主要介紹了Spring導(dǎo)入properties配置文件代碼示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • Java 實(shí)現(xiàn)瀏覽器下載文件及文件預(yù)覽

    Java 實(shí)現(xiàn)瀏覽器下載文件及文件預(yù)覽

    這篇文章主要介紹了Java 實(shí)現(xiàn)瀏覽器下載文件及文件預(yù)覽,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 通過實(shí)例學(xué)習(xí)JAVA對象轉(zhuǎn)成XML輸出

    通過實(shí)例學(xué)習(xí)JAVA對象轉(zhuǎn)成XML輸出

    這篇文章主要介紹了通過實(shí)例學(xué)習(xí)JAVA對象轉(zhuǎn)成XML輸出,做流程圖的項(xiàng)目時,新的流程定義為xml的,需要對xml與java對象進(jìn)行互轉(zhuǎn),下面我們來深入學(xué)習(xí),需要的朋友可以參考下
    2019-06-06
  • Spring Boot 中實(shí)現(xiàn)跨域的多種方式小結(jié)

    Spring Boot 中實(shí)現(xiàn)跨域的多種方式小結(jié)

    Spring Boot提供了多種方式來實(shí)現(xiàn)跨域請求,開發(fā)者可以根據(jù)具體需求選擇適合的方法,在配置時,要確保不僅考慮安全性,還要兼顧應(yīng)用的靈活性和性能,本文給大家介紹Spring Boot 中實(shí)現(xiàn)跨域的多種方式,感興趣的朋友一起看看吧
    2024-01-01
  • Spring框架中IoC容器與DI依賴注入教程

    Spring框架中IoC容器與DI依賴注入教程

    IOC也是Spring的核心之一了,之前學(xué)的時候是采用xml配置文件的方式去實(shí)現(xiàn)的,后來其中也多少穿插了幾個注解,但是沒有說完全采用注解實(shí)現(xiàn)。那么這篇文章就和大家分享一下,全部采用注解來實(shí)現(xiàn)IOC + DI
    2023-01-01
  • 詳解如何獲取PreparedStatement參數(shù)示例詳解

    詳解如何獲取PreparedStatement參數(shù)示例詳解

    這篇文章主要為大家介紹了詳解如何獲取PreparedStatement參數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Java實(shí)現(xiàn)簡易學(xué)生管理系統(tǒng)

    Java實(shí)現(xiàn)簡易學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡易學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07

最新評論