java数组线程安全

时间:2010-09-17 17:32:31

标签: java arrays thread-safety

java中的ArrayList是线程安全的。它是使用array实现的。

那么,java线程中对数组的访问是否安全?是否需要同步对数组的访问?

3 个答案:

答案 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

您可能会收到不正确的结果,甚至是无法察觉的结果或异常。您可以完成搞砸​​列表并使其永久无法使用。