自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

簡(jiǎn)單地理解區(qū)分CountDownLatch與CyclicBarrier--高并發(fā)編程

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

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

[[276796]]

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

  1. //創(chuàng)建一個(gè)倒計(jì)時(shí)鎖,設(shè)置值為5 
  2.  final CountDownLatch latch = new CountDownLatch(5); 
  3.  try { 
  4.  //啟用5個(gè)線程 
  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("子線程執(zhí)行!"); 
  15.  //讓latch鎖中的數(shù)值減1 
  16.  latch.countDown(); 
  17.  } 
  18.  }).start(); 
  19.  } 
  20.  //處于阻塞狀態(tài)直到latch中數(shù)值為零才執(zhí)行后續(xù)操作 
  21.  latch.await(); 
  22.  System.out.println("主線程執(zhí)行"); 
  23.  } catch (Exception e) { 
  24.  System.out.println("捕獲異常"); 
  25.  } 

運(yùn)行結(jié)果:

簡(jiǎn)單地理解區(qū)分CountDownLatch與CyclicBarrier--高并發(fā)編程

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

  • 首先先設(shè)置一個(gè)CountDownLatch倒計(jì)時(shí)鎖 ,并設(shè)置倒計(jì)時(shí)值為5
  • 每一個(gè)子線程進(jìn)行自己的工作,當(dāng)工作執(zhí)行完畢完畢后通過執(zhí)行l(wèi)atch.countDown()對(duì)倒計(jì)時(shí)鎖的值進(jìn)行減1操作,表示自己工作完成。
  • 主線程latch.await() 后的代碼段一直屬于等待狀態(tài),直到CountDownLatch的值為0時(shí)才繼續(xù)執(zhí)行。

[[276797]]

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

  1. //建立一個(gè)屏障并設(shè)定一個(gè)值,當(dāng)有足夠的線程達(dá)到屏障時(shí)再一起釋放 
  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 + "號(hào)玩家,已準(zhǔn)備好,等待進(jìn)入游戲"); 
  12. barrier.await(); 
  13. System.out.println(num + "號(hào)玩家,已經(jīng)進(jìn)入游戲"); 
  14. } catch (InterruptedException e) { 
  15. e.printStackTrace(); 
  16. } catch (BrokenBarrierException e) { 
  17. e.printStackTrace(); 
  18. }); 
  19. executorPool.shutdown(); 

運(yùn)行結(jié)果:

簡(jiǎn)單地理解區(qū)分CountDownLatch與CyclicBarrier--高并發(fā)編程

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

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

簡(jiǎn)單地理解區(qū)分CountDownLatch與CyclicBarrier--高并發(fā)編程

三、兩者對(duì)比

簡(jiǎn)單地理解區(qū)分CountDownLatch與CyclicBarrier--高并發(fā)編程

最后

CyclicBarrier(同步屏障)和CountDownLatch(倒計(jì)時(shí)鎖)都是不錯(cuò)的高并發(fā)編程工具類,兩者很相似容易造成混淆,通過理解兩者各自工作方式和特點(diǎn)并結(jié)合業(yè)務(wù)需求合理地應(yīng)用他們會(huì)有不錯(cuò)的效益。

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2024-04-02 09:40:39

多線程Java原子性

2014-03-14 10:34:28

JavaJava并發(fā)

2020-12-03 11:15:21

CyclicBarri

2021-03-18 00:14:29

JavaCyclicBarri高并發(fā)

2021-03-11 00:05:55

Java高并發(fā)編程

2024-04-29 09:06:46

線程初始化源碼

2025-04-23 08:31:26

Java并發(fā)框架

2016-05-06 14:02:18

JavaScript原型鏈

2022-08-07 23:52:10

Python模塊數(shù)據(jù)分析

2020-06-29 08:32:21

高并發(fā)程序員流量

2025-01-10 07:10:00

2024-11-13 15:09:57

Java線程開發(fā)

2020-12-11 07:32:45

編程ThreadLocalJava

2020-11-13 08:42:24

Synchronize

2017-02-20 07:47:04

緩存HASH高并發(fā)

2021-02-26 13:08:27

Java高并發(fā)AQS

2023-07-06 08:06:47

LockCondition公平鎖

2022-10-12 07:53:46

并發(fā)編程同步工具

2020-09-22 12:00:23

Javahashmap高并發(fā)

2020-10-13 07:44:45

理解分布式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)