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

簡單地理解區分CountDownLatch與CyclicBarrier--高并發編程

開發 開發工具
本文主要討論在高并發編程中兩非常實用工具CyclicBarrier(同步屏障)和CountDownLatch(倒計時鎖),兩者都是java.util.concurrent并發包內非常有用的并發工具類,為了幫助理解會結合一些有趣的比喻,下面將對兩者進行討論。

本文主要討論在高并發編程中兩非常實用工具CyclicBarrier(同步屏障)和CountDownLatch(倒計時鎖),兩者都是java.util.concurrent并發包內非常有用的并發工具類,為了幫助理解會結合一些有趣的比喻,下面將對兩者進行討論。

[[276796]]

一、CountDownLatch倒計時鎖(一個線程等待另外N個線程完成某個事情之后才能執行)

  1. //創建一個倒計時鎖,設置值為5 
  2.  final CountDownLatch latch = new CountDownLatch(5); 
  3.  try { 
  4.  //啟用5個線程 
  5.  for (int i = 1; i <= 5; i++) { 
  6.  new Thread(new Runnable() { 
  7.  @Override 
  8.  public void run() { 
  9.  try { 
  10.  Thread.sleep(1000); 
  11.  } catch (Exception e) { 
  12.  e.printStackTrace(); 
  13.  } 
  14.  System.out.println("子線程執行!"); 
  15.  //讓latch鎖中的數值減1 
  16.  latch.countDown(); 
  17.  } 
  18.  }).start(); 
  19.  } 
  20.  //處于阻塞狀態直到latch中數值為零才執行后續操作 
  21.  latch.await(); 
  22.  System.out.println("主線程執行"); 
  23.  } catch (Exception e) { 
  24.  System.out.println("捕獲異常"); 
  25.  } 

運行結果:

簡單地理解區分CountDownLatch與CyclicBarrier--高并發編程

解析:倒計時鎖理解起來比較容易,這里通過結合實際場景幫助理解。場景:一張數據表中存放大量的數據,現要讀取表里的所有信息。為了提高讀取效率便通過在主線程中開啟多個子線程分工合作對數據表進行讀取。接下來要等待全部子線程讀取完畢之后,將讀取到的內容進行匯總并在主線程中進行處理。

  • 首先先設置一個CountDownLatch倒計時鎖 ,并設置倒計時值為5
  • 每一個子線程進行自己的工作,當工作執行完畢完畢后通過執行latch.countDown()對倒計時鎖的值進行減1操作,表示自己工作完成。
  • 主線程latch.await() 后的代碼段一直屬于等待狀態,直到CountDownLatch的值為0時才繼續執行。

[[276797]]

二、可循環使用的屏障CyclicBarrier(N個線程相互等待,任何一個線程完成之前,所有的線程都必須等待)

  1. //建立一個屏障并設定一個值,當有足夠的線程達到屏障時再一起釋放 
  2. CyclicBarrier barrier = new CyclicBarrier(5, () -> { 
  3. System.out.println("開始游戲"); 
  4. }); 
  5. ExecutorService executorPool = Executors.newCachedThreadPool(); 
  6. for (int i = 1; i <= 5; i++) { 
  7. int num = i
  8. Thread.sleep(1000); 
  9. executorPool.execute(() -> { 
  10. try { 
  11. System.out.println(num + "號玩家,已準備好,等待進入游戲"); 
  12. barrier.await(); 
  13. System.out.println(num + "號玩家,已經進入游戲"); 
  14. } catch (InterruptedException e) { 
  15. e.printStackTrace(); 
  16. } catch (BrokenBarrierException e) { 
  17. e.printStackTrace(); 
  18. }); 
  19. executorPool.shutdown(); 

運行結果:

簡單地理解區分CountDownLatch與CyclicBarrier--高并發編程

解析:這里通過一個形象的例子來幫助理解CyclicBarrier。

  • 一開始建立一個CyclicBarrier對象并設置parties的值為5(理解為開啟一個游戲房間,且需要5個玩家都準備好的條件之后才能開啟游戲,各個玩家才能進行游戲游玩)。
  • 循環開啟多個線程并各自調用barrier.await(),理解為玩家分別都進入房間并做好了準備,線程當調用barrier.await()方法計數會加1,如果計數還達不到CyclicBarrier預先設置的parties值時則該線程會進入等待狀態。
  • 當線程barrier.await()方法計數達到CyclicBarrier預先設置的parties值時,便開始游戲。這個時候所有的線程(玩家)便同時進入到了游戲中。

簡單地理解區分CountDownLatch與CyclicBarrier--高并發編程

三、兩者對比

簡單地理解區分CountDownLatch與CyclicBarrier--高并發編程

最后

CyclicBarrier(同步屏障)和CountDownLatch(倒計時鎖)都是不錯的高并發編程工具類,兩者很相似容易造成混淆,通過理解兩者各自工作方式和特點并結合業務需求合理地應用他們會有不錯的效益。

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2024-04-02 09:40:39

多線程Java原子性

2014-03-14 10:34:28

JavaJava并發

2020-12-03 11:15:21

CyclicBarri

2021-03-18 00:14:29

JavaCyclicBarri高并發

2021-03-11 00:05:55

Java高并發編程

2024-04-29 09:06:46

線程初始化源碼

2025-04-23 08:31:26

Java并發框架

2016-05-06 14:02:18

JavaScript原型鏈

2022-08-07 23:52:10

Python模塊數據分析

2020-06-29 08:32:21

高并發程序員流量

2025-01-10 07:10:00

2020-12-11 07:32:45

編程ThreadLocalJava

2020-11-13 08:42:24

Synchronize

2024-11-13 15:09:57

Java線程開發

2017-02-20 07:47:04

緩存HASH高并發

2023-07-06 08:06:47

LockCondition公平鎖

2021-02-26 13:08:27

Java高并發AQS

2022-10-12 07:53:46

并發編程同步工具

2020-09-22 12:00:23

Javahashmap高并發

2020-10-13 07:44:45

理解分布式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av在线成人 | 一区二区三区日 | 欧美久久久久久 | 欧美在线精品一区 | 亚洲精品视频免费观看 | 国产成人精品一区二区三区四区 | 国产精品综合色区在线观看 | 久久精品国产99国产精品 | 国产黄色一级电影 | 伊人网综合在线观看 | 日韩av成人在线 | 欧州一区二区三区 | 日韩精品无码一区二区三区 | 精品视频999 | 91精品国产综合久久久久久丝袜 | 夏同学福利网 | 综合久久99 | 一区二区精品 | 亚洲美女视频 | 久久91av | 一区二区三区四区在线免费观看 | 日本黄色影片在线观看 | 亚洲日产精品 | 日韩免费一区二区 | 欧美综合国产精品久久丁香 | 国产96色在线| 91文字幕巨乱亚洲香蕉 | 在线观看成人免费视频 | 亚洲精品一区中文字幕乱码 | 日本免费视频在线观看 | 国产精品国产自产拍高清 | 成人在线免费电影 | 日韩欧美在线一区 | 国产亚洲精品精品国产亚洲综合 | 亚洲精品自在在线观看 | 99精品视频在线观看免费播放 | 日本黄色一级视频 | 精品国产伦一区二区三区观看说明 | 国产精品视频999 | 国产黄色精品在线观看 | 国产美女h视频 |