Java中的同步 - Vector与ArrayList

时间:2014-03-20 16:59:47

标签: java arraylist synchronized synchronized-block

我试图理解Vector和ArrayList类在线程安全方面的区别。据推测,Vector内部同步。它是由每个元素或整体同步的吗? (我可以想象多个线程可以同时访问向量的情况,但多个线程无法同时访问同一个元素)。如果查看下面的代码,getAo()不等同于getV(),因为方法签名中使用的synchronized关键字在包含的类对象({{1}的实例)上同步}) 据我所知。但是,VectorVsArrayList相当于getAoSync()?通过等价,我的意思是getV()实例变量在同步方面的行为就像Vector对象一样,只要对它的所有访问都通过getter方法?

ao

3 个答案:

答案 0 :(得分:1)

简短回答:不,这不等同。

synchronized周围使用return ao;时,ArrayList仅在返回指令期间同步。这意味着2个线程无法在同一时间获取对象,但一旦获得它,它们就可以同时修改

如果2个线程执行此代码,则add()不是线程安全的:

ArrayList<?> list = getAo(); // cannot be executed concurrently
list.add(something); // CAN be executed concurrently

旁注:不要使用向量,请查看this post以了解原因。

答案 1 :(得分:1)

他们不等同。您正在寻找的是Collections.synchronizedList,它可以包裹&#34;任何列表,包括ArrayList

答案 2 :(得分:1)

执行Vector的等效操作,您应该保护对集合中任何元素的任何访问,方法getAo只是同步访问数组列表。

如果两个线程调用getAo并且在每个线程调用之后&#34;添加&#34;这个arraylist的方法然后你可能有一个多线程问题(因为&#34;添加&#34;不同步&#34;)。

我建议你检查像CopyOnWriteArrayList这样的原子类: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CopyOnWriteArrayList.html