Java ArrayList.add()方法线程安全纯粹并行添加?

mad*_*n54 2 java multithreading arraylist thread-safety

考虑一个带有ArrayList引用的函数的for循环,并将一个对象添加到该ArrayList.我现在想并行执行每个函数调用.

如果我不关心添加对象的序列并且没有函数读取或操作任何ArrayList元素,那么ArrayList.add()方法线程是否安全?所以我只想确保在并行调用结束时将所有对象添加到列表中.

JB *_*zet 8

不,它不是线程安全的.使用包裹列表Collections.synchronizedList(),或在访问列表时使用显式同步.

  • 任何事情都可能发生:它可能运行良好,或者元素可能会丢失,或者您可能会遇到异常,或者列表可能处于不连贯状态.让你的程序正确,然后看看它是否足够快.如果不是,并且如果您证明对列表的同步访问是问题(这是不可能的),那么只考虑如何优化代码. (4认同)

man*_*uti 5

ArrayList.add()不是线程安全的.即使您没有从其他线程中读取列表,也不应该依赖这个逻辑假设.这是以下定义ArrayList.add():

public boolean add(E e) {
    ensureCapacity(size + 1);
    elementData[size++] = e;
    return true;
}
Run Code Online (Sandbox Code Playgroud)

作为在没有同步的情况下可能出现的问题的示例,size在添加所有元素之后该属性可能不一致.如果您稍后尝试获取元素数量,结果可能不正确.