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

并行流?再用打斷狗腿!

開發 前端
很久之前,xjjdog就有一篇文章,詳細分析了為什么不要隨便使用并行流,因為里面坑多肉少,還隱藏了很多不為人知的超級惡心的小秘密。

[[416374]]

本文轉載自微信公眾號「小姐姐味道」,作者小姐姐養的狗。轉載本文請聯系小姐姐味道公眾號。

很久之前,xjjdog就有一篇文章,詳細分析了為什么不要隨便使用并行流,因為里面坑多肉少,還隱藏了很多不為人知的超級惡心的小秘密。

parallelStream的坑,不踩不知道,一踩嚇一跳

但今天還是在線上的故障中,又一次碰見了它。相對于parallelStream可能讓程序運行的更緩慢(沒錯),更要命的是它會讓你的程序拋出異常,運行變得不準確。當最終確認了根本的問題,一股惡心的感覺涌上心頭。我干嘔了幾聲,心情難以言表。

這個場景在我們上篇文章中,被判定是小兒科。但即使是這么小兒科的代碼,還是有人中招,還是要對并發編程有一點敬畏之心呀,不是很懂的api弄懂才能用。

問題原因

先來看看這段小代碼吧。

  1. List transform(List source){ 
  2.  List dst = new ArrayList<>(); 
  3.  if(CollectionUtils.isEmpty()){ 
  4.   return dst; 
  5.  } 
  6.  source.stream. 
  7.   .parallel() 
  8.   .map(..) 
  9.   .filter(..) 
  10.   .foreach(dst::add); 
  11.  return dst; 

程序很簡單,期望使用stream的方式,把一個list經過轉化和過濾之后,轉化為另外一個list。尤其注意的是,代碼使用了parallel(),意思是底層會通過forkjoin的方式,去運行你的代碼。

上線之后,應用發生了詭異的反應。在返回的List中,某些數據有時候出現,有時候又消失不見,就像是被阿里公關下的熱搜一樣,成為了幽靈數據。更有趣的是,它還會拋異常。

追根究底

其實,明眼人一看parallell這個關鍵字,就恨得牙癢癢。在并行的方法里使用線程不安全的集合類,是Java編程之大忌。

讓我們強行去掉這些干擾因素,來模擬這個數據丟失情況。

  1. public class xx { 
  2.     static List<Integer> transform(List<Integer> source){ 
  3.         List dst = new ArrayList<>(); 
  4.         source.stream().parallel().map(i -> i*10).forEach(dst::add); 
  5.         return dst; 
  6.     } 
  7.     public static void main(String[] args) { 
  8.         List<Integer> source = new ArrayList<>(); 
  9.         for(int i=0;i<500;i++){ 
  10.             source.add(i); 
  11.         } 
  12.         for(int i=0;i<100;i++) { 
  13.             System.out.println("size = " + transform(source).size()); 
  14.         } 
  15.     } 

我們主要是對500條數據進行轉換。很快,你將會看到異常。但大多數情況下,數據條數根本達不到500條,部分數據,離奇的消失了。

  1. size = 499 
  2. size = 500 
  3. size = 484 
  4. size = 500 
  5. Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException 
  6.  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
  7.  at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
  8.  at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
  9.  at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
  10.  at java.util.concurrent.ForkJoinTask.getThrowableException(ForkJoinTask.java:598) 
  11.  at java.util.concurrent.ForkJoinTask.reportException(ForkJoinTask.java:677) 
  12.  at java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:735) 

既然是并行,那用屁股想一想,就知道這里面肯定會有線程安全問題。不過我們這里討論的并不是要你使用線程安全的集合,這個話題太低級。現階段,知道在線程不安全的環境中使用線程安全的集合,已經是一個基本的技能。

我現在收回上面的話,因為我發現它并不是一個基本的技能。

對于ArrayList來說,它的add操作,并不是線程安全的,并不是一個原子操作。

  1. public boolean add(E e) { 
  2.   ensureCapacityInternal(size + 1);  
  3.   elementData[size++] = e; 
  4.   return true

你看上面的代碼多明顯啊,先需要讀取size的值,然后有一個加1操作,然后又有一個自增操作。這種代碼,說什么也是不敢用在多線程環境下的。

總結

相同的道理,你也不是這樣去搞普通的map,普通的queue,那都不是安全的操作。

還是建議你讀一下它更隱秘的坑。

parallelStream的坑,不踩不知道,一踩嚇一跳

實際上,我是非常的不建議你在任何時候,使用parallelStream或者parallel函數。一旦你在代碼里發現了它,請干掉它,并向它吐一口唾沫,就當它從未在jdk中存在過。相對于它增加的那納兒毫秒的速度,它所引入的問題才是更加要命的。

事實上,我已經在sonar的檢測規則中加入了它,讓它徹底在我的視野中消失。

作者簡介:小姐姐味道 (xjjdog),一個不允許程序員走彎路的公眾號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高并發世界,給你不一樣的味道。

 

責任編輯:武曉燕 來源: 小姐姐味道
相關推薦

2020-07-21 15:00:49

Java 8并行流Java

2024-04-19 08:28:57

JavaAPI場景

2023-10-12 08:29:06

線程池Java

2023-09-14 12:03:30

空指針判空

2022-07-22 09:15:07

OpitonalJava代碼

2025-05-19 04:00:00

2023-10-07 08:17:40

公平鎖非公平鎖

2014-07-09 10:56:44

.NET框架

2022-05-19 08:47:30

Flinkwatermark窗口計算

2021-06-09 06:41:11

OFFSETLIMIT分頁

2017-03-13 08:40:45

AndroidDebugBuildConfig

2021-01-29 11:05:50

PrintPython代碼

2020-12-03 09:05:38

SQL代碼方案

2020-12-02 11:18:50

print調試代碼Python

2020-12-15 08:06:45

waitnotifyCondition

2018-06-24 09:27:55

線程Tomcat多線程

2023-10-26 16:33:59

float 布局前段CSS

2020-12-04 10:05:00

Pythonprint代碼

2020-12-30 07:08:27

Java方法測試

2021-05-25 09:30:44

kill -9Linux kill -9 pid
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲a级| 国产精品福利久久久 | 午夜免费福利影院 | 欧美日韩专区 | 天天影视网天天综合色在线播放 | 色视频免费 | 日韩欧美中文字幕在线观看 | 国产日韩一区二区三免费高清 | 伊人影院在线观看 | 国产精品久久一区 | 91超碰caoporn97人人 | 成在线人视频免费视频 | 风间由美一区二区三区在线观看 | 久久www免费视频 | 国产精品亚洲视频 | 日本欧美国产 | 国产视频久 | 欧美视频免费 | 五月天婷婷丁香 | 一区二区三 | av中文网| 高清视频一区二区三区 | 久久久精品网 | 密色视频 | 色嗨嗨| 欧美精品电影一区 | 亚洲一区视频在线 | 国产欧美一区二区三区久久手机版 | 中文字幕视频在线 | 亚洲精品精品 | 人人叉| 日本免费黄色 | 国产日韩免费观看 | 欧美日韩国产一区二区 | 久久精品国产v日韩v亚洲 | 久久一区二区三区四区五区 | 欧美激情在线精品一区二区三区 | 国产成人精品免费视频 | 亚洲精品在线视频 | 91精品国产综合久久久久久 | 亚洲精品乱码久久久久久久久久 |