在迭代SynchronizedList时如何锁定List本身?

时间:2012-03-28 06:59:31

标签: java synchronization locking

请参阅以下代码:

    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”作为锁,则调用者和内部之间的锁是不同的。我认为这个事实让同步毫无意义。

2 个答案:

答案 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

}