我正在看这段代码。此构造函数委托(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()
。如果 someCollection
是 ArrayList
,最终将调用 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/