CopyOnWriteArrayList基於線程安全的

筆者通過查閱資料發現JDK提供了一些線程安全的容器,常見的像大家都熟悉的ConcurrentHashMap,對於老式比較粗糙的同步集合類Hashtable,它的方法內部並不是使同步關鍵字Synchronize來阻塞多線程的操作,而是通過分段鎖來實現,具體可以通過查閱部分資料來了解,今天筆者要來自研一下關於List線程安全的容器,筆者閱歷有限,到現在只知道幾個關於ArrayList能在多線程環境下實現同步的集合類,第一種是通過JDK提供的老式容器Vector來實現,但是這個容器現在基本不使用了,還有一個就是通過Collections.synchronizedList(new ArrayList()) 得到一個線程安全的ArrayList對象,但是這種方式也是在List內部的方法上使用了Sychronized關鍵字。可以看到 Hashtable–>ConcurrentHashMap,還是說Vector–>CopyOnWriteArrayList。JUC下支持併發的容器與老一代的線程安全類相比,其實就是加鎖粒度大小的問題。

通過查看CopyOnWriteArrayList 源碼發現內部使用過ReentantLock來實現寫方法的鎖的,修改的時候複製出一個與原數組一樣的新數組並加鎖實現修改操作,而讀的時候的時候不加鎖 通過操作原數組來實現讀取數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章