2014-10-09 21 views
1

我只調用addAll並清除列表,但需要它來線程安全,是否有任何現有List for this?謝謝java列表適用於addAll和clear的線程安全

+1

「線程安全」是一個很大的術語。如果兩個線程同時調用addAll,是不是足夠了沒有'ConcurrentModificationException',或者是否需要第二個線程元素之前添加的第一個線程的所有元素? – Mureinik 2014-10-09 10:08:56

+0

如果您想要高質量的特定答案,您確實需要添加有關該方案的更多詳細信息。 – biziclop 2014-10-09 10:18:24

回答

1

使用Collections.synchronizedList(List list)將滿足這些要求的清單創建,提供的同步列表是調用addAll(...)時的目標對象,而不是參數。

如果同步列表(如上創建)是參數,則問題是addAll(list)迭代參數list,並且迭代同步列表不是原子的。如果另一個線程在添加時更新list,則您有可能得到ConcurrentModificationException

如果你需要做一個線程安全的方式addAll(list)在併發更新的臉list,那麼你需要做一個listCopyOnWriteArrayList

0

如果你想使用exsting列表作爲同步單,去Collections.synchronizedList(list)或正在創建目標列表,那麼你可以去CopyOnWriteArrayList

-1

的CopyOnWriteArrayList是synchronizedList併發替代,在某些常見的情況下提供更好的併發&消除了在迭代期間鎖定或複製集合的需要。

寫入集合上的副本從派生它們的線程安全性的事實是,作爲一個有效的不可變對象被正確發佈,訪問它時不需要進一步的同步。他們通過創建&每次修改時重新發布集合的新副本來實現可變性。無論後續修改如何,該集合都不會引發ConcurrentModificationException。