如果已经迭代同步,是否有必要使用synchronizedList而不是List?

时间:2015-03-05 21:28:16

标签: java multithreading list synchronization

任务很简单。我有十几个主题和一个"全球"列表(某些对象)。 每个线程(周期性地)遍历所有列表以找到所需对象并更改它(如果不存在则添加它)。然后再次迭代并将所有对象保存到文件中。 JavaDoc说:"当迭代它时,用户必须在返回的列表上手动同步" 而现在 - 我在列表中执行的所有操作都是在synchronized块中完成的。 正如我所理解的那样,在synchronizedList的内部实现中,也会出现一些同步,并且它们(我想)会增加不需要的延迟。

如果我使用简单列表怎么办? 我认为 - 如果我对列表的所有操作已经处于关键部分 - 如果我改变了,我会失去什么

private static final List<JobSummary> SyncJS = Collections.synchronizedList(new ArrayList<JobSummary>());

private static final List<JobSummary> SyncJS = new ArrayList<>(); 

或者我错过了什么?

2 个答案:

答案 0 :(得分:1)

同步对象的要点是避免手动同步。如果你在synchronized区块内,那么你不需要它们。它只是额外的开销。

答案 1 :(得分:0)

操作&#34;找到所需的对象并进行更改&#34;不是原子的,因此您需要在执行任何非原子操作之前同步列表。

如果您同步所有操作的列表,则不需要Collections.synchronizedList(new ArrayList<JobSummary>())new ArrayList<>()会运作良好。