我对此的理解是synchronized
块阻止其他线程访问,直到该块终止为止;也就是说,它们会被当前正在执行的类(?)保持锁定,直到那时为止。
所以我包装了一个for
块,它遍历一个列表,然后在clear()
块中直接调用该列表上的synchronized
。因为我不能让其他线程添加到这两组操作之间的列表中。这与文件一致,即
用户必须手动同步返回的内容 迭代时的集合......
但是当我add
到列表时,我无法确定是否需要这样做。我猜不是,因为在我的情况下,来自不同线程的add
操作的顺序并不重要。我想我不确定的是,synchronized
修改操作是否会产生任何负面影响?
答案 0 :(得分:2)
只有在必须协同工作的多个操作时才需要锁定。对于迭代器,您将在循环的整个生命周期内执行任何操作。
如果可以按任何顺序添加,则不需要额外的锁定。
我包装一个for块,迭代一个列表,然后调用clear()
从您的用例中,它听起来像一个BlockingQueue(没有同步的线程安全),甚至ExecutorService(它将一个线程池与一个队列结合起来)将是更好的选择。
答案 1 :(得分:0)
在Collection本身上进行同步非常重要
Collection c = Collections.synchronizedCollection(myCollection);
...
synchronized (c) {
for(Object o : c) {
....
}
调用c
的任何方法的其他线程将被阻止,直到您离开块。无需其他同步