write有幾種常見實現方式?
1、CopyOnWriteArrayList是線程安全的List,底層數據結構也是數組結構,不過通過volatile修飾,使得寫操作之后立即刷新內存,使得其他線程讀最新的數據。是基于CopyOnWrite機制實現的線程安全的List
2、CopyOnWriteArrayList每次插入數據都會進行一次擴容,容量加1,并且在寫之前都需要通過ReentrantLock加鎖處理,然后復制原數組,寫完數據之后直接覆蓋原數組
3、CopyOnWriteArrayList的讀操作沒有加鎖處理,所以會存在臟讀問題,可能會讀到其他線程以及修改,但是還沒有替換原數組的數據
4、CopyOnWriteArrayList每次插入數據都會涉及到數組的復制,所以不適合頻繁寫而導致頻繁復制數組的場景,而讀沒有加鎖,所以適合寫少讀多的場景。
5、CopyOnWriteArrayList通過迭代器循環時,只可以循環讀,而不可以執行寫操作,因為迭代的數據是副本數據。
6、CopyOnWriteArrayList的set方法當設置數據一直時也同樣會復制數組,不是為了保證數組的可見性,而是為了保證外部非volatile變量的happen-before關系,從而實現volatile的語義。