java中的ArrayList是线程安全的。它是使用array实现的。
那么,java线程中对数组的访问是否安全?是否需要同步对数组的访问?
答案 0 :(得分:7)
不,ArrayList
在Java中不是线程安全的。
来自the docs:
请注意,此实现未同步。如果多个线程访问
ArrayList
并发实例,并且至少有一个线程在结构上修改列表 必须在外部同步。
您是否在考虑内部使用同步的Vector
? (基本上,每种方法都是同步的。)
答案 1 :(得分:1)
线程安全数组看起来像什么?您无法添加或删除数组的元素。您所能做的就是为各个成员分配值。
假设你的代码有
int x = a[2];
a[3] = x;
该线程安全吗? (提示:可能不是,取决于你想要的[2]和[3]的一致性。)
一般情况下:从显着的线程安全开始。把同步放进去 - 它不是那么昂贵。真的想想你的语义。测试它并解决僵局 - 如果你遇到这样的问题,你很可能没有考虑过你想要做的事情。只有当您的性能测试真正表明这是您开始变得聪明的瓶颈时。
答案 2 :(得分:1)
Java内存模型将每个数组元素视为一个单独的变量。您可能对此类变量执行线程不安全操作,就像任何其他变量一样。
数组本身非常安全。
static Object[] a;
// thread 1
a = new Object[10];
// thread 2
read a.length // ok
read a[0] // ok
a[0] = something // ok
有什么大不了的?例如,如果使用ArrayList,如果没有正确的同步,这样的操作就不安全
static ArrayList a;
// thread 1
a = new ArrayList( another_collection_with_10_null );
// thread 2
a.size(); // unsafe
a.get(0); // unsafe
a.set(0, something); // unsafe
您可能会收到不正确的结果,甚至是无法察觉的结果或异常。您可以完成搞砸列表并使其永久无法使用。