多線程list.add()丟數據


問題:

根據項目業務需求需要統計數據傳到前台以圖表顯示,每天數據量大概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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM