java数组线程安全

问题描述:

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

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

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

the docs

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

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

+0

它应该与各种读写锁定同步,因为读取可以同时进行。如果它使用排他锁,那么我不喜欢'Vector' :) – Andrey 2010-09-17 17:51:44

+1

@Andrey:嗯,这正是它所做的。 Vector'完全同步。 (这实际上并没有使它正确地线程安全......只是每一个单独的操作。) – 2010-09-17 18:05:23

+0

@ohhh是ArrayList不是线程安全的,但多线程访问数组的方式是什么?它在内部是同步的,还是我们必须同步外部访问? – userv 2010-09-19 08:56:38

线程安全的数组会是什么样子?您不能添加或移除数组的元素。你所能做的就是给每个成员分配值。

假设你的代码有

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

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

一般来说:从显着的线程安全开始。把同步放在 - 它并不昂贵。真的想想你的意思。测试它并解决僵局 - 如果你有这样的问题,你可能没有想到你正在努力做的事情。只有当你的性能测试真的证明这是你的瓶颈开始变得聪明。

+0

线程安全不能*可能*不可以。它可以是或不是。 – Andrey 2010-09-17 17:52:55

+1

@Andrey - 那么代码线程安全吗?假设数组赋值是原子的,并且忘记了所有的寄存器缓存问题。想象一下围绕我的两行代码进行同步。现在是代码线程安全吗?你不知道,你不知道,因为你需要更多的信息。我的代码是否打算[2]和[3]始终保持一致?或者我不在乎?如果没有这些信息,它可能是安全的,但这可能不是。我在说OQ可能会问错误的问题。 – djna 2010-09-17 20:02:16

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结果,或例外。你可能会搞砸列表并使其永久无法使用。