parallelStream中的執行緒安全問題
parallelStream中的執行緒安全問題
在面試的時候很多人喜歡問併發程式設計,那麼在實際開發中我們能用到多少呢?今天在這裡舉個例子就是實際開發中的併發程式設計的問題。在我們經常寫的業務程式碼中很多時候會出現遍歷迴圈的情況,比如取集合資料、封裝集合資料等等,這是我們不能避免的。
在jdk1.8中給我們提供了stream;為什麼在很多時候我們的遍歷還是進行普通的迴圈?因為這個和我們的程式設計習慣有關係,我最初接觸的就是普通的迴圈,而且一用很多年,所以有時候在業務很緊急的情況下,首先碼出來的肯定是我們千錘百煉的手法。這不是我們的錯,錯就錯在了誰讓它出的這麼晚了?如果從一開始就用的是stream,那你用起來肯定比別人快很多。在這裡不是教大家怎麼使用流,這個百度一大堆。在這裡說的是使用並行會出現很多問題。言歸正傳!
在很多時候普通的for迴圈以後夠了,因為資料量不大的情況下,jdk底層對它的優化是非常好的。所以看情況而定,不是說所有的迴圈都要用流遍歷。大資料量的遍歷用parallelStream可以比普通遍歷節省一半的時間,這個親測過。
在使用stream.foreach時這個遍歷沒有執行緒安全問題,但是使用parallelStream就會有執行緒安全問題,所有在parallelStream裡面使用的外部變數,比如集合一定要使用執行緒安全集合,不然就會引發多執行緒安全問題。在並行時,實際上是多個執行緒執行,這個時候還有個問題,就是當你在遍歷中使用例如請求裡面的資料時,就會報一個異常,這個異常就是多個執行緒執行,但是其他執行緒沒有這個請求的資料,所以獲取不到。這時解決辦法是把需要的資料在遍歷外面取到,再傳遞進去就可以解決。
在這裡順帶說一下排序,儘量不要自己去實現排序,這個效能並不理想。儘量用jdk自己的排序,底層對jdk排序優化,不是我們所能比擬的。這個也是親測過的。
例如 :
// 這是假設的資料
Map<Integer, Object> dataMap = Maps.newConcurrentMap();
Map<Integer, Object> error = Maps.newConcurrentMap();
Map<Integer, Object> rest = new TreeMap<Integer, Object>(new Comparator() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
// 假設這是一個需要從請求中獲取的資料,所以先從外面獲取,再傳遞進去
String number = request.getParameter(‘number’);
// 假設封裝了一個集合資料
List listStudent = new ArrayList<>();
listStudent.parallelStream().forEach(student -> {
// 在遍歷時取索引
int index = listStudent.indexOf(student);
// 校驗資料
handleData(index, student, number, error, dataMap);
});
相關文章
- 模板方法中的執行緒安全問題執行緒
- lambda中stream執行緒安全的問題執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- JUC之集合中的執行緒安全問題執行緒
- ArrayList 的執行緒安全問題執行緒
- 03 執行緒安全問題執行緒
- SimpleDateFormat 執行緒安全問題ORM執行緒
- 深入JAVA執行緒安全問題Java執行緒
- 多執行緒,你覺得你安全了?(執行緒安全問題)執行緒
- 探究Spring中Bean的執行緒安全性問題SpringBean執行緒
- Java 執行緒安全問題的本質Java執行緒
- 執行緒中斷以及執行緒中斷引發的那些問題執行緒
- 多執行緒的安全性問題(三)執行緒
- SpringMVC中出現的執行緒安全問題分析SpringMVC執行緒
- 單例模式中可能存在的一些問題(執行緒安全問題)單例模式執行緒
- Java中解決多執行緒資料安全問題Java執行緒
- 單例模式執行緒安全reorder問題單例模式執行緒
- 從FMDB執行緒安全問題說起執行緒
- 多執行緒的安全問題及解決方案執行緒
- Java之執行緒安全問題的3種處理方式(通過執行緒同步)Java執行緒
- 5分鐘搞懂多執行緒安全問題執行緒
- Python執行緒安全問題及解決方法Python執行緒
- 多執行緒併發安全問題詳解執行緒
- Spring中多執行緒的使用及問題Spring執行緒
- iOS多執行緒全套:執行緒生命週期,多執行緒的四種解決方案,執行緒安全問題,GCD的使用,NSOperation的使用iOS執行緒GC
- Java中列舉的執行緒安全性及序列化問題Java執行緒
- 深入解讀HashMap執行緒安全性問題HashMap執行緒
- J2SE - 關於SimpleDateFonnat的執行緒安全問題執行緒
- 執行緒安全引起的錄音雜音電流音問題執行緒
- java 執行緒安全問題,解決執行緒安全問題——同步程式碼塊,同步方法,Lock鎖,Object類中wait方法,notify方法。等待喚醒案例。Java執行緒ObjectAI
- 【Java多執行緒】執行緒安全的集合Java執行緒
- String中hashCode方法的執行緒安全執行緒
- JDk1.7 HashMap原始碼解析——執行緒安全問題JDKHashMap原始碼執行緒
- 子執行緒使用父執行緒RequestScope作用域Bean問題的探究執行緒Bean
- 執行緒安全執行緒
- 多執行緒問題解釋執行緒
- JUC之多執行緒鎖問題執行緒
- 多執行緒相關問題執行緒