0

我对此的理解是,一个synchronized块会阻止其他线程访问,直到该块终止为止。也就是说,它们通过当前执行的类(?)持有的锁被搁置到那时。

所以我包装了一个for迭代列表的块,然后在一个块clear()中直接调用该列表。synchronized因为我不能让其他线程添加到这两组操作之间的列表中。这是按照文档说的,

当迭代它时,用户必须手动同步返回的集合......

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

4

2 回答 2

2

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

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

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

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

于 2012-12-18T16:00:31.210 回答
0

在 Collection 本身上同步很重要

Collection c = Collections.synchronizedCollection(myCollection);
     ...
synchronized (c) {
     for(Object o : c) {
      ....  
}

调用任何方法的其他线程c将被阻止,直到您离开该块。无需其他同步

于 2012-12-18T15:58:55.200 回答