1. 程式人生 > >ArrayList在Java多執行緒中的應用

ArrayList在Java多執行緒中的應用

ArrayList是非執行緒安全的。

問題描述

開發中,存在這樣的業務邏輯,類似倒金字塔結構,下層資料需要基於上層的資料進行邏輯計算。設計思路是:定義一個全域性變數upLayerList,來儲存上一層的資料。每一層計算僅需要知道upLayerList就可以,不用關心上一層資料怎麼獲取。當前層計算完畢後,把結果賦值給upLayerList,留給下一層使用。

問題重現

模擬業務邏輯實現:

這裡寫圖片描述

實現多執行緒:

這裡寫圖片描述

正常的輸出:

Runner1 : [1, 2, 3]
Runner2 : [4, 5, 6]

實際輸出:

這裡寫圖片描述

執行緒1和執行緒2修改了彼此的list。

解決方案1

使用同步關鍵字synchronized

這裡寫圖片描述

執行緒1和執行緒2交叉執行輸出:

這裡寫圖片描述

解決方案2

傳值,每一層都傳upLayerList。

這裡寫圖片描述

實際測試結果:

這裡寫圖片描述

其他解決方案

定義變數:uplayerList = Collections.synchronizedList(new ArrayList<>());,uplayerList 是執行緒安全的,但是後面對uplayerList 的操作不是執行緒安全的。需要對操作加同步關鍵字synchronized

擴充套件

以上是針對實際問題的2種解決方案,歡迎留言指正。