许多线程将字符串添加到列表的问题

时间:2014-03-20 09:35:10

标签: java multithreading collections thread-safety

这是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)

该线程安全吗?这样做会有什么问题?

4 个答案:

答案 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)将新值写回。