ArrayList在Java多執行緒中的應用
阿新 • • 發佈:2019-01-01
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種解決方案,歡迎留言指正。