在同步块中包装CopyOnWriteArrayList

时间:2016-01-07 14:59:15

标签: java multithreading

我有一个多线程程序,其中多个线程正在访问和编辑我的数据结构;我的数据结构是CopyOnWriteArrayList。由于CopyOnWriteArrayList是Java Concurrent包的一部分,当我对它执行修改操作时,是否仍然必须将数据结构包装在Synchronized块中?

2 个答案:

答案 0 :(得分:1)

答案取决于程序的体系结构。您可以完全使用“线程安全”类来构建程序,但这不一定会使您的应用程序“线程安全”。

只要有一个无法将数据置于临时无效状态的线程无法正常工作,您就需要进行同步。为了使其工作,您必须synchronize创建临时无效状态的例程,并且还必须同步可能看到状态的每个例程。

所以,问题是,当一个线程将CopyOnWriteArrayList置于一个你不希望另一个线程看到的状态时,你的程序执行是否有任何时刻? (因为它的内容在内部不一致,或者因为它与其他一些数据结构不一致)。

如果答案为是,那么您仍然需要同步。

答案 1 :(得分:0)

No, you don't have to

  

ArrayList的线程安全变体,其中包含所有可变操作   (添加,设置等)是通过制作新的副本来实现的   底层数组。

根据您修改数据的频率,CopyOnWriteArrayList可能不是最佳选择。有关一些潜在的替代方案,请参阅this StackOverflow question