成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JUC - CountDownLach原理分析

開發 后端
CountDownLatch 和 Semaphore 一樣都是共享模式下資源問題,這些源碼實現AQS的模版方法,然后使用CAS+循環重試實現自己的功能。

[[345820]]

 CountDownLach閉鎖
背景

  • CountDownLatch是在Java1.5被引入,跟它一起被引入的工具類還有CyclicBarrier、Semaphore、ConcurrenthashMap和BlockingQueue。
  • 在java.util.cucurrent包下。

概念

  • CountDownLatch這個類使一個線程等待其它線程各自執行完畢后再執行。
  • 是通過一個計數器來實現的,計數器的初始值是線程的數量。每當一個線程執行完畢后,計數器的值就-1,當計數器的值為0時,表示所有線程都執行完畢,然后在閉鎖上等待的線程就可以恢復工作來。

源碼

  • countDownLatch類中只提供了一個構造器
  1. public CountDownLatch(int count) { 
  2.   if (count < 0) throw new IllegalArgumentException("count < 0"); 
  3.      this.sync = new Sync(count); 
  • 類中有三個方法是最重要的
  1. // 調用await()方法的線程會被掛起,它會等待直到count值為0才繼續執行 
  2. public void await() throws InterruptedException { 
  3.         sync.acquireSharedInterruptibly(1); 
  4.     }//和await()方法類似,只不過等待一定的時間后count值還沒變為0的化就會繼續執行 
  5. public boolean await(long timeout, TimeUnit unit) 
  6.         throws InterruptedException {        return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout)); 
  7.     }//將count值減1 
  8. public void countDown() {        sync.releaseShared(1); 
  9.     } 

示例
普通示例:

  1. public class CountDownLatchTest { 
  2.     public static void main(String[] args) { 
  3.         final CountDownLatch latch = new CountDownLatch(2); 
  4.         System.out.println("主線程開始執行…… ……"); 
  5.         //第一個子線程執行 
  6.         ExecutorService es1 = Executors.newSingleThreadExecutor(); 
  7.         es1.execute(new Runnable() { 
  8.             @Override 
  9.             public void run() { 
  10.                 try { 
  11.                     Thread.sleep(3000); 
  12.                     System.out.println("子線程:"+Thread.currentThread().getName()+"執行"); 
  13.                 } catch (InterruptedException e) { 
  14.                     e.printStackTrace(); 
  15.                 } 
  16.                 latch.countDown(); 
  17.             } 
  18.         }); 
  19.         es1.shutdown(); 
  20.         //第二個子線程執行 
  21.         ExecutorService es2 = Executors.newSingleThreadExecutor(); 
  22.         es2.execute(new Runnable() { 
  23.             @Override 
  24.             public void run() { 
  25.                 try { 
  26.                     Thread.sleep(3000); 
  27.                 } catch (InterruptedException e) { 
  28.                     e.printStackTrace(); 
  29.                 } 
  30.                 System.out.println("子線程:"+Thread.currentThread().getName()+"執行"); 
  31.                 latch.countDown(); 
  32.             } 
  33.         }); 
  34.         es2.shutdown(); 
  35.         System.out.println("等待兩個線程執行完畢…… ……"); 
  36.         try { 
  37.             latch.await(); 
  38.         } catch (InterruptedException e) { 
  39.             e.printStackTrace(); 
  40.         } 
  41.         System.out.println("兩個子線程都執行完畢,繼續執行主線程"); 
  42.     } 

結果集:

  1. 主線程開始執行…… …… 
  2. 等待兩個線程執行完畢…… ……子線程:pool-1-thread-1執行子線程:pool-2-thread-1執行兩個子線程都執行完畢,繼續執行主線程 

模擬并發示例:

  1. public class Parallellimit { 
  2.     public static void main(String[] args) { 
  3.         ExecutorService pool = Executors.newCachedThreadPool();        CountDownLatch cdl = new CountDownLatch(100); 
  4.         for (int i = 0; i < 100; i++) { 
  5.             CountRunnable runnable = new CountRunnable(cdl); 
  6.             pool.execute(runnable);        }    }} class CountRunnable implements Runnable { 
  7.     private CountDownLatch countDownLatch; 
  8.     public CountRunnable(CountDownLatch countDownLatch) { 
  9.         this.countDownLatch = countDownLatch; 
  10.     }    @Override 
  11.     public void run() { 
  12.         try { 
  13.             synchronized (countDownLatch) {                /*** 每次減少一個容量*/ 
  14.                 countDownLatch.countDown();                System.out.println("thread counts = " + (countDownLatch.getCount())); 
  15.             }            countDownLatch.await(); 
  16.             System.out.println("concurrency counts = " + (100 - countDownLatch.getCount())); 
  17.         } catch (InterruptedException e) { 
  18.             e.printStackTrace();        }    }} 

源碼分析

  1. public class CountDownLatch { 
  2.     //繼承AQS來實現他的模板方法(tryAcquireShared,tryReleaseShared) 
  3.     private static final class Sync extends AbstractQueuedSynchronizer {       //計數個數Count 
  4.         Sync(int count) { 
  5.             setState(count);        }        int getCount() { 
  6.             return getState(); 
  7.         }      //AQS方法getState(),返回同步狀態,這里指計數器值        protected int tryAcquireShared(int acquires) { 
  8.             return (getState() == 0) ? 1 : -1; 
  9.         }       //循環+cas重試 直到計數器為0 跳出,則release(實現aqs共享模式釋放方法) 
  10.         protected boolean tryReleaseShared(int releases) { 
  11.             // Decrement count; signal when transition to zero 
  12.             for (;;) { 
  13.                 int c = getState(); 
  14.                 if (c == 0) 
  15.                     return false
  16.                 int nextc = c-1; 
  17.                 if (compareAndSetState(c, nextc)) 
  18.                     return nextc == 0; 
  19.             }        }    }    private final Sync sync;   //實例化 
  20.     public CountDownLatch(int count) { 
  21.         if (count < 0) throw new IllegalArgumentException("count < 0"); 
  22.         this.sync = new Sync(count);    }    public void await() throws InterruptedException {        sync.acquireSharedInterruptibly(1); 
  23.     }  //帶有一個超時時間的awit    public boolean await(long timeout, TimeUnit unit)        throws InterruptedException {        return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout)); 
  24.     }      public void countDown() {        sync.releaseShared(1); 
  25.     }    public long getCount() {        return sync.getCount(); 
  26.     }} 

總結
CountDownLatch 和 Semaphore 一樣都是共享模式下資源問題,這些源碼實現AQS的模版方法,然后使用CAS+循環重試實現自己的功能。在RT多個資源調用,或者執行某種操作依賴其他操作完成下可以發揮這個計數器的作用。

責任編輯:姜華 來源: 今日頭條
相關推薦

2020-11-03 09:10:18

JUC-Future

2023-04-26 08:39:41

Bitmap元素存儲

2022-04-13 08:23:31

Golang并發

2021-10-12 17:19:17

Random局限性變量

2012-12-03 16:57:37

HDFS

2025-06-13 10:00:00

JavaJUC 包

2021-08-09 11:15:28

MybatisJavaSpring

2009-11-06 09:22:46

WCF應用

2021-04-21 15:17:10

WebsocketWsnodejs

2021-11-26 17:17:43

Android廣播運行原理源碼分析

2017-02-09 13:23:46

2015-06-15 10:12:36

Java原理分析

2015-09-23 16:14:03

Ryu拓撲結構

2023-02-07 09:17:19

Java注解原理

2022-04-12 08:30:45

TomcatWeb 應用Servlet

2024-01-12 07:38:38

AQS原理JUC

2012-03-06 11:01:44

Java

2012-12-03 17:12:10

HDFS

2023-05-31 08:39:04

redis事件驅動

2010-03-16 12:28:23

無線UWB技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久草视| 国产精品久久久久久福利一牛影视 | 九九热在线免费视频 | 国产一级片一区二区 | 视频一区二区在线观看 | 色综网| 中文字幕91 | 久久av一区二区三区 | 日韩中文字幕视频在线 | 欧美在线综合 | 欧美精品一区二区三区蜜臀 | 超碰av免费 | 亚洲精品中文在线 | 夜夜久久 | 国产欧美一区二区三区在线播放 | 日韩视频在线一区 | 国产精品99999999 | 欧美在线视频网 | 久久久久久蜜桃一区二区 | 超碰av在线| 狠狠干av| 成人国产精品久久久 | 国产电影一区二区三区爱妃记 | 中文字幕高清在线 | 精品中文字幕久久 | 国产精品国产馆在线真实露脸 | 91视频国产精品 | 欧美一区二区三区在线 | 精品视频一区二区三区四区 | 欧美精品一区二区三区在线播放 | 狠狠久| 欧美中文在线 | h免费观看 | 精品欧美激情在线观看 | 操操日| 国产精品小视频在线观看 | 欧美不卡视频一区发布 | 欧美高清一区 | 99在线免费观看视频 | 日韩一区二区三区在线 | 亚洲成人网在线 |