我有一个多线程程序,多个线程正在访问和编辑我的数据结构;我的数据结构是CopyOnWriteArrayList。由于CopyOnWriteArrayList是Java并发包的一部分,在对其执行修改操作时,是否仍必须将数据结构包装在同步块中?
发布于 2016-01-07 15:40:24
答案取决于程序的架构。您可以完全使用“线程安全”类构建程序,但这并不一定会使应用程序“线程安全”。
当线程没有将数据放入暂时无效状态时,就需要同步。为了使其工作,您必须synchronize创建临时无效状态的例程,还必须同步可能看到该状态的每个例程。
因此,问题是,在执行您的程序时,是否有某个线程可以将该CopyOnWriteArrayList设置为您不希望看到的另一个线程的状态?(要么是因为其内容内部不一致,要么是因为它与某些其他数据结构不一致)。
如果答案是肯定的,那么您仍然需要同步。
发布于 2016-01-07 15:12:58
ArrayList的一个线程安全变体,其中所有的可变操作(添加、设置等)都是通过创建基础数组的新副本来实现的。
但是,根据您修改数据的频率,CopyOnWriteArrayList可能不是最好的选择。有关一些潜在的替代方案,请参见这个StackOverflow问题。
https://stackoverflow.com/questions/34658321
复制相似问题