Java 迭代同步包装器安全吗?

Java 迭代同步包装器安全吗?,java,multithreading,synchronized,Java,Multithreading,Synchronized,我决定深入研究一下源代码,并注意到它的实现如下: public static <T> List<T> synchronizedList(List<T> list) { return (list instanceof RandomAccess ? new SynchronizedRandomAccessList<T>(list) : new SynchronizedList<T>(list)); }

我决定深入研究一下源代码,并注意到它的实现如下:

public static <T> List<T> synchronizedList(List<T> list) {
    return (list instanceof RandomAccess ?
        new SynchronizedRandomAccessList<T>(list) :
        new SynchronizedList<T>(list));
}
可以看出,该类使用
private
lock对象来提供线程安全性。但是允许我们使用锁定工厂方法返回的objetct来迭代它

用户必须手动同步返回的数据 在对其进行迭代时列出:

所以,我们使用不同的锁来迭代和修改列表(
add
remove
,等等)

为什么它被认为是安全的?

收集#同步列表方法

public static <T> List<T> synchronizedList(List<T> list) {
    return (list instanceof RandomAccess ?
            new SynchronizedRandomAccessList<>(list) :
            new SynchronizedList<>(list));
}
公共静态列表同步列表(列表列表){
返回(列出随机访问的实例)?
新同步随机访问列表(列表):
新同步列表(列表));
}
使用问题中显示的单参数构造函数。该构造函数调用超级构造函数,该构造函数将
设置为
互斥体
。所有的方法都是
同步的
互斥体上

文档告诉您在迭代时也要同步实例。该引用与方法体中的
this
相同


所有这些操作(如果你做得对的话,应该)因此共享同一个锁。

因此,我们使用不同的锁来迭代和修改列表,这是什么让你这么认为?@SotiriosDelimanolis我引用的源代码。在嵌套类中,我们使用了无法从外部访问的synchronized(mutex)。
public static <T> List<T> synchronizedList(List<T> list) {
    return (list instanceof RandomAccess ?
            new SynchronizedRandomAccessList<>(list) :
            new SynchronizedList<>(list));
}