创建 ArrayList
的新实例是否线程安全?通过构造函数 ArrayList(Collection<? extends E> sourceCollection)
没有任何额外的同步,假设 sourceCollection
是同步的吗?更具体地说,在这种情况下,我们能否依靠新列表来准确包含当时集合中的元素 new ArrayList(sourceCollection)
被调用?我们能否依靠新列表保持一致状态?
我问这个问题是因为我在书中看到了有关如何将对象限制为线程堆栈上的局部变量的并发示例。在这些示例中,一个方法被传递了一个对共享对象的引用,并且在该方法内部,该对象的一个副本存储在一个局部变量中——所有这些都没有任何同步。据称可以通过这种方式实现线程安全。一个一般的例子是:
public void someMethod(Collection<String> source) {
List<String> localList = new ArrayList<>(source);
...
}
最佳答案
提示:正如@John Bollinger 刚刚提到的,特定的ArrayList
实现不在语言规范中。所以下面的写法适用于 Oracle java 8 实现。
是的,如果source
是同步集合是安全的,因为这种情况下的ArrayList
构造函数使用了source集合的toArray()
方法,这也是同步的并产生新的数据副本:
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
// ...
}
关于java - ArrayList(Collection<? extends E> c) 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42236414/