ArrayList的使用及ConcurrentModificationException問題解決
ArrayList是一種動態陣列,可以動態的增加或刪除元素。ArrayList和Vector都是用陣列實現的,但二者存在一定的區別:
Vector是多執行緒安全的,而ArrayList則不是
Vector使用synchronized來實現同步,所以在效能上比不上ArrayList。當空間不足時,Vector增加原空間的一倍(預設值),但ArrayList增加原空間的50%
Vector可以設定增長因子,而ArrayList不可以
在日常開發中,經常使用ArrayList,可以實現快速的隨機訪問。但在多執行緒環境下,必須採用一定的措施來解決ConcurrentModificationException問題。
ConcurrentModificationException
解決方法包括3種:
-
使用Vector代替ArrayList
其執行緒安全的實現方式是對所有操作都加上了synchronized關鍵字,這種方式嚴重影響效率;並且也不是完全安全。具體參考Why is Java Vector class considered obsolete or deprecated? -
使用CopyOnWriteArrayList
CopyOnWriteArrayList的寫操作效能較差,而多執行緒的讀操作效能較好。因為CopyOnWriteArrayList的實現方式是在寫入時通過複製連結串列來實現,每次新增都需要複製,對記憶體消耗大;在寫入時需要加synchronized保護,但讀取時則不需要進行同步。
CopyOnWriteArrayList只能保證資料最終的一致性,但是讀寫分離時可能存在實時的不一致性。 -
使用Collections.synchronizedList
使用Collections.synchronizedList在部分關鍵方法中使用了synchronized進行同步;但注意在一些非原子操作時,仍需要使用synchronized。此時的鎖物件需為Collections.synchronizedList自身。
Collections.synchronizedList的寫操作效能比CopyOnWriteArrayList在多執行緒操作的情況下要好很多,而讀操作因為是採用了synchronized關鍵字的方式,其讀操作效能並不如CopyOnWriteArrayList。
可以根據不同的應用場景,選擇不同的多執行緒安全實現類。
參考方法:
CopyOnWriteArrayList與Collections.synchronizedList的效能對比
聊聊併發-Java中的Copy-On-Write容器
【集合型別的併發】Collections.synchronizedList
相關文章
- Homestead 使用問題及解決方式
- WIN 8.1使用常見問題及解決
- 使用API28報錯問題及解決API
- goland中npm無法使用的問題及解決方法GoLandNPM
- 常見問題及解決
- 奇怪的登入問題及解決
- iPhone 6/Plus常見使用問題及解決方案iPhone
- Q9使用常見問題及解決方案
- 【DataBase】:使用Oracle遇到的幾個問題及解決辦法DatabaseOracle
- ArrayList 原始碼分析 — 擴容問題及序列化問題原始碼
- ArrayList 原始碼分析 -- 擴容問題及序列化問題原始碼
- Git常見問題及解決Git
- Harbor搭建及配置 問題解決
- 跨域問題及解決方案跨域
- redis安裝及問題解決Redis
- 常見問題及解決方案
- CAS導致的ABA問題及解決
- IPython的安裝及問題解決Python
- Kafka常見的問題及解決方案Kafka
- 使用kerl安裝erlang遇到的問題及解決辦法-bak
- 解決「問題」,不要解決問題
- 解決無法使用VI的問題
- CKEditor使用中遇到的問題解決
- 解決在使用Amoeba遇到的問題
- 近期工作遇到的問題及解決方式收藏
- nodejs 近期所遇到的問題及解決NodeJS
- JS中toFixed()方法的問題及解決方案JS
- 裝SAP GUI時遇到的問題及解決GUI
- Nacos 常見問題及解決方法
- UltraEdit常見問題及解決教程
- Segments by ITL Waits 問題及解決AI
- WordPress:常見問題及解決方案
- 使用weiXinRecorded不支援targetSdkVersion升級23及以上問題的解決方案
- java.util.ConcurrentModificationException解決詳解JavaException
- 使用Nginx來解決跨域的問題Nginx跨域
- java.util.ConcurrentModificationException 時的解決辦JavaException
- 多執行緒的安全問題及解決方案執行緒
- vue渲染時閃爍{{}}的問題及解決方法Vue