Collections.synchronizedList.add()需要同步块吗?

时间:2012-12-18 15:52:26

标签: java multithreading

我对此的理解是synchronized块阻止其他线程访问,直到该块终止为止;也就是说,它们会被当前正在执行的类(?)保持锁定,直到那时为止。

所以我包装了一个for块,它遍历一个列表,然后在clear()块中直接调用该列表上的synchronized。因为我不能让其他线程添加到这两组操作之间的列表中。这与文件一致,即

  

用户必须手动同步返回的内容   迭代时的集合......

但是当我add到列表时,我无法确定是否需要这样做。我猜不是,因为在我的情况下,来自不同线程的add操作的顺序并不重要。我想我不确定的是,synchronized 修改操作是否会产生任何负面影响?

2 个答案:

答案 0 :(得分:2)

只有在必须协同工作的多个操作时才需要锁定。对于迭代器,您将在循环的整个生命周期内执行任何操作。

如果可以按任何顺序添加,则不需要额外的锁定。

  

我包装一个for块,迭代一个列表,然后调用clear()

从您的用例中,它听起来像一个BlockingQueue(没有同步的线程安全),甚至ExecutorService(它将一个线程池与一个队列结合起来)将是更好的选择。

答案 1 :(得分:0)

在Collection本身上进行同步非常重要

Collection c = Collections.synchronizedCollection(myCollection);
     ...
synchronized (c) {
     for(Object o : c) {
      ....  
}
调用c的任何方法的其他线程将被阻止,直到您离开块。无需其他同步