Java - ArrayList 构造函数的线程安全

标签 java collections concurrency

我正在看这段代码。此构造函数委托(delegate)给 native 方法“System.arraycopy”

线程安全吗?我的意思是它会抛出 ConcurrentModificationException 吗?

public Collection<Object> getConnections(Collection<Object> someCollection) {
    return new ArrayList<Object>(someCollection);
}

如果被复制的集合是线程安全的,例如 CopyOnWriteArrayList,有什么不同吗?

public Collection<Object> getConnections(CopyOnWriteArrayList<Object> someCollection) {
    return new ArrayList<Object>(someCollection);
}

编辑: 我知道 ThreadSafe != ConcurrentModificationException。我正在尝试在某个时间点拍摄数据快照。因此,如果另一个线程在副本中途写入 someCollection,我不关心结果是否有新对象。我只是不想让它抛出 ConcurrentModificationException 或更糟的异常

最佳答案

This constructor delegates to the native method "System.arraycopy"

实际上,它在 someCollection 上调用了 toArray()。如果 someCollectionArrayList,最终将调用 System.arraycopy。对于其他集合类型,数组将以其他方式创建。

Is it Thread safe?

没有。

And by that I mean can it ever throw a ConcurrentModificationException?

如果它是一个 ArrayList,它不会抛出 ConcurrentModificationException ... 但这并不能使它成为线程安全的!/p>

I am trying to take a snapshot of data at a point in time.

您不会(总是)获得一致的快照。

例如,如果另一个线程在 someCollection 上调用 set(obj, pos) 而您的线程正在调用此构造函数,那么您新创建的 ArrayList 是不可预测的。

在 Java 11 版本中,ArrayList(Collection) 构造函数对参数集合调用 toArray()。生成的 ArrayList 将是集合的一致快照当且仅当toArray 调用保证提供一致的快照。这对于某些集合类(例如 CopyOnWriteList)是正确的,但一般情况下并非如此。

关于Java - ArrayList 构造函数的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2681816/

相关文章:

python - 增加计数器并在超过阈值时触发操作

java - 如何在 Java 中对单词进行所有可能的转换

java - 获取Spring WebClient请求的状态码

幕后的Java 8方法引用

Java Collection-ArrayList 和 Vector 之间的加速

java - 在Java中是否可以等待不在线程中的方法完成?

java - 将线程注册到 Phaser

java - 窗口内容大小不受 Window min -height -width 影响

java - 经过 x 时间后自动从列表中删除

c# - 使用反射从类列表的属性中获取值