请参阅以下代码:
List list = Collections.synchronizedList(new ArrayList());
// ...
synchronized (list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
我知道调用者在迭代同步列表时应该同步,但我无法理解为什么使用“list”作为锁。 Inner SynchronizedList类,私有成员互斥锁是锁。所以如果调用者使用“list”作为锁,则调用者和内部之间的锁是不同的。我认为这个事实让同步毫无意义。
答案 0 :(得分:2)
您可以看到Collections.synchronizedList的代码。然后你会发现synchronizedList的实现使用“this”来锁定添加或删除方法。在这里你锁定“列表”以防止调用“添加”或“删除”方法。
答案 1 :(得分:1)
因为要使迭代原子和线程安全,你需要使用与synchronizedList相同的锁,恰好是the list itself。在代码中,默认构造函数将其用作互斥锁:
SynchronizedCollection(Collection<E> c) {
if (c==null)
throw new NullPointerException();
this.c = c;
mutex = this; // <=== here
}