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