Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在迭代SynchronizedList时,如何锁定列表本身?_Java_Synchronization_Locking - Fatal编程技术网

Java 在迭代SynchronizedList时,如何锁定列表本身?

Java 在迭代SynchronizedList时,如何锁定列表本身?,java,synchronization,locking,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 list = Collections.synchronizedList(new ArrayList());
    // ...
    synchronized (list) {
        Iterator i = list.iterator(); // Must be in synchronized block
        while (i.hasNext())
            foo(i.next());
    }

我知道调用方在迭代同步列表时应该同步,但我不理解为什么要使用“列表”作为锁。在SynchronizedList类内部,私有成员互斥锁是锁。所以,若调用方使用“列表”作为锁,则调用方和内部的锁是不同的。我认为这个事实毫无意义

因为要使迭代原子化和线程安全,您需要使用与synchronizedList相同的锁,而synchronizedList正好是。在代码中,默认构造函数将其用作互斥体:

SynchronizedCollection(Collection<E> c) {

    if (c==null)

        throw new NullPointerException();

    this.c = c;

    mutex = this; // <=== here

}
SynchronizedCollection(集合c){
如果(c==null)
抛出新的NullPointerException();
这个.c=c;

mutex=this;//因为要使迭代原子化和线程安全,您需要使用与synchronizedList相同的锁,而synchronizedList正好是。在代码中,默认构造函数将其用作mutex:

SynchronizedCollection(Collection<E> c) {

    if (c==null)

        throw new NullPointerException();

    this.c = c;

    mutex = this; // <=== here

}
SynchronizedCollection(集合c){
如果(c==null)
抛出新的NullPointerException();
这个.c=c;

mutex=this;//您可以看到Collections.synchronizedList的代码。然后您会发现synchronizedList的实现在添加或删除方法时使用“this”来锁定。在这里,您锁定“list”以防止调用“add”或“remove”方法。

您可以看到Collections.synchronizedList的代码。然后您会发现synchronizedList的实现在添加或删除方法时使用“this”来锁定。在这里,您锁定“list”以防止调用“add”或“remove”方法。

我看到了Collections.synchronizedList的代码,并发现锁是“mutex”而不是“this”.所以我很困惑…你可以在这里看到代码,“mutex=this”(SynchronizedList是SynchronizedCollection的子类,在SynchronizedCollection的构造方法中):哦,我现在明白了。我太粗心了。谢谢你的回答。我看到了Collections.SynchronizedList的代码,发现锁是“mutex”而不是“this”.所以我很困惑…你可以在这里看到代码,“mutex=this”(SynchronizedList是SynchronizedCollection的子类,在SynchronizedCollection的构造方法中):哦,我现在明白了。我太粗心了。谢谢你的回答。也谢谢你。我知道私有成员“mutex”就是“this”,我现在清楚了。也谢谢你。我知道私人成员“互斥”就是“这个”,我现在清楚了。