繁体   English   中英

java数组线程安全

[英]java array thread safety

java中的ArrayList是线程安全的,它是使用数组实现的。

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

不, ArrayList在Java中不是线程安全的。

来自文档

请注意,此实现不同步。 如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改了列表,则必须在外部进行同步。

你在考虑在内部使用同步的Vector吗? (基本上,每种方法都是同步的。)

线程安全阵列会是什么样的? 您无法添加或删除数组的元素。 您所能做的就是为各个成员分配值。

假设你的代码有

  int x = a[2];
  a[3] = x;

这个线程安全吗? (提示:可能不是,取决于你想要的[2]和[3]的一致性)。

一般来说:从明显的线程安全开始。 把同步放进去 - 它不是那么昂贵。 真的想想你的语义。 测试它并解决僵局 - 如果你遇到这样的问题,你很可能没有考虑过你想要做的事情。 只有当您的性能测试真正表明这是您开始变得聪明的瓶颈时。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM