問題:
根據項目業務需求需要統計數據傳到前台以圖表顯示,每天數據量大概20萬多,但是每次統計只能統計出10萬的數據量,出現數據丟失。
原因:
該接口在之前一次優化時加了多線程,但是數據匯總用的仍是ArrayList,ArrayList線程不安全,當一條線程執行list.add()的時候會出現被另一條線程的值覆蓋,比如線程A對list進行add,攜帶的size是n,同時線程B也進行add操作,攜帶的size也是n,所以ArrayList沒有達到擴容的條件,A的值應該放在ArrayList的第n位,但是B的值也將放在第n位,覆蓋了A的值,導致數據丟失。
ArrayList add()部分源碼解讀:

解決方案:
(1)Vector:線程安全,但不推薦使用,因為加了鎖,導致性能降低。
(2)List<String> list=Collections.synchronizedList(new ArrayList<>());使用Collections工具類將線程不安全的集合轉成線程安全的集合,
(3)java.concurrent.CopyOnWriteArrayList(寫入時復制思想),做add操作時加了鎖ReentrantLock。
