- 最近在Project上遇到一個問題,有一個ArrayList在讀取時偶發出現ConcurrentModificationException,這是因為不同Thread間剛好一個在寫入一個在讀取ArrayList,當然這可以用Mutex或Synchronize來解決,只是想估狗看看有沒有更好的方法,後來查到了原來有CopyOnWriteArrayList這個東西!
- 它和ArrayList很像,但是有以下特性:
- 它是Thread-Safe的
- 在做寫入時(add()/set()/remove())會複製一份出來改,overhead較大
- Iterator支持hasNext()/next()等的讀取動作,但不支持remove()等的寫入操作
- 使用Iterator掃過一遍List的速度很快
- 它的內部實作是透過volatile的資料以及Mutex來達到Thread-Safe,並且寫入時複製一份做修改,改完再設回給volatile的資料。
- 適用在List項目不會太多,讀取多,寫入少,會有Iterator掃過一遍且需要Thread-Safe的情況。
沒有留言:
張貼留言