我有一个多线程程序,其中多个线程正在访问和编辑我的数据结构;我的数据结构是CopyOnWriteArrayList。由于CopyOnWriteArrayList是Java Concurrent包的一部分,当我对它执行修改操作时,是否仍然必须将数据结构包装在Synchronized块中?
答案 0 :(得分:1)
答案取决于程序的体系结构。您可以完全使用“线程安全”类来构建程序,但这不一定会使您的应用程序“线程安全”。
只要有一个无法将数据置于临时无效状态的线程无法正常工作,您就需要进行同步。为了使其工作,您必须synchronize
创建临时无效状态的例程,并且还必须同步可能看到状态的每个例程。
所以,问题是,当一个线程将CopyOnWriteArrayList
置于一个你不希望另一个线程看到的状态时,你的程序执行是否有任何时刻? (因为它的内容在内部不一致,或者因为它与其他一些数据结构不一致)。
如果答案为是,那么您仍然需要同步。
答案 1 :(得分:0)
ArrayList的线程安全变体,其中包含所有可变操作 (添加,设置等)是通过制作新的副本来实现的 底层数组。
根据您修改数据的频率,CopyOnWriteArrayList
可能不是最佳选择。有关一些潜在的替代方案,请参阅this StackOverflow question。