这是Do I need a concurrent collection for adding elements to a list by many threads?
的后续帖子那里的每个人都专注于清单。我理解这可能是一个问题,但是......添加元素怎么样?那是线程安全的吗?
示例代码
static final Collection<String> FILES = new ArrayList<String>(1000000);
我在许多线程中执行(我添加少于1000000个元素)
FILES.add(string)
该线程安全吗?这样做会有什么问题?
答案 0 :(得分:1)
ArrayList<String>
本身不同步。请改用Collections.synchronizedList(new ArrayList<String>())
。
答案 1 :(得分:0)
使用Collections.syncronizedList(new ArrayList<String>(1000000))
答案 2 :(得分:0)
即使列表没有扩展,它也会保持其内部状态,例如当前大小。从更广泛的意义上说,ArrayList
被指定为一个不可线程的可变对象,因此并发调用任何mutator方法是非法的。
答案 3 :(得分:0)
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
这是7u40-b43中ArrayList的源代码。 方法ensureCapacityInternal()不是线程安全的,而size ++也不是。 大小++由三个步骤完成,1)获取大小,2)大小+1,3)将新值写回。