[英]java array thread safety
java中的ArrayList是线程安全的,它是使用数组实现的。
那么,在java线程中访问数组是否安全?对数组的访问是否需要同步?
线程安全阵列会是什么样的? 您无法添加或删除数组的元素。 您所能做的就是为各个成员分配值。
假设你的代码有
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.