原創轉載請注明出處:https://www.cnblogs.com/agilestyle/p/11443907.html
CopyOnWriteArrayList
CopyOnWriteArrayList是java.util.concurrent包提供的方法,它實現了讀操作無鎖,寫操作則通過操作底層數組的新副本來實現,是一種讀寫分離的並發策略。
CopyOnWrite它的原理是,任何修改操作,如add、set、remove,都會拷貝原數組,修改后替換原來的數組,通過這種防御性的方式,實現另類的線程安全。
所以這種數據結構,相對比較適合讀多寫少的操作,不然修改的開銷還是非常明顯的,適用於讀遠大於寫的場景。
Note:
CopyOnWriteArraySet是通過包裝了CopyOnWriteArrayList來實現的
Vector
Vector是Java早期提供的線程安全的動態數組,synchronized關鍵字幾乎修飾了所有對外暴露的方法,所以在讀遠大於寫的操作場景中,Vector將會發生大量鎖競爭,從而給系統帶來性能開銷。如果不需要線程安全,並不建議選擇,畢竟同步是有額外開銷的。Vector內部是使用對象數組來保存數據,可以根據需要自動的增加容量,當數組已滿時,會創建新的數組,並拷貝原有數組數據。
ArrayList
ArrayList是應用更加廣泛的動態數組實現,它本身不是線程安全的,所以性能要好很多。與Vector近似,ArrayList也是可以根據需要調整容量,不過兩者的調整邏輯有所區別,Vector在擴容時會提高1倍,而ArrayList則是增加50%。
LinkedList
LinkedList是Java提供的雙向鏈表,所以它不需要像上面兩種那樣調整容量,它也不是線程安全的。