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
您可能会得到不正确的结果,甚至unsensible结果,或例外。你可能会搞砸列表并使其永久无法使用。
它应该与各种读写锁定同步,因为读取可以同时进行。如果它使用排他锁,那么我不喜欢'Vector' :) – Andrey 2010-09-17 17:51:44
@Andrey:嗯,这正是它所做的。 Vector'完全同步。 (这实际上并没有使它正确地线程安全......只是每一个单独的操作。) – 2010-09-17 18:05:23
@ohhh是ArrayList不是线程安全的,但多线程访问数组的方式是什么?它在内部是同步的,还是我们必须同步外部访问? – userv 2010-09-19 08:56:38