Java开发中强调的一个模块始终使用Vector上的ArrayList。矢量已弃用。这可能是事实,但Vector和Hashtable具有同步的优点。在Java中使用Hashtable,Vector或HashMap或ArrayList
我正在使用面向并发的并行应用程序,使用像Vector一样同步的对象会不会有好处?看起来他们有他们的位置?
Java开发中强调的一个模块始终使用Vector上的ArrayList。矢量已弃用。这可能是事实,但Vector和Hashtable具有同步的优点。在Java中使用Hashtable,Vector或HashMap或ArrayList
我正在使用面向并发的并行应用程序,使用像Vector一样同步的对象会不会有好处?看起来他们有他们的位置?
Vector和Hashtable的问题在于它们只在本地同步。它们不会在并发应用程序中破坏(如在损坏的数据中),然而,由于本地同步(例如get是同步的,但只有在得到返回时),您仍然希望执行自己的同步,无论如何,作为内容的迭代。现在,即使你的put方法需要一些额外的同步来配合迭代同步,并且你最终会遇到你的Hashtable/Vector被双重同步的情况。
究竟哪些不正确? – falstro 2009-01-17 18:28:37
如果您需要同步ArrayList或HashMap,可以将它们包装起来。
List list = Collections.synchronizedList(new ArrayList(...));
Map m = Collections.synchronizedMap(new HashMap(...));
个人而言,我觉得在这些集合重线程代码不是非常有用的“同步”的方法。有一些更新的集合可以提供更多帮助,但大多数情况下,我发现自己正在创建自己的同步对象并在其周围进行同步,或者使用java.util.concurrent中的新锁定
同步有它的位置,但那不是只有Vector
和ArrayList
之间的区别。 Vector
每次超过其容量时,其内部存储阵列增长一个固定的数量,而ArrayList
增长一个固定的因子,这通常是一个更好的方法(因为它给出了O(1)的amortized cost附加项目)。
还要注意的是Collections.synchronizedList()
可以用来创建任何List
实现同步视图,这样你就不必被绑定到的Vector
的特性(您可能需要例如同步LinkedList
)。
您可以使用静态集合方法,将一个列表或地图到同步版本:http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#synchronizedList(java.util.List)
一般您通常需要锁定更多的是到列表或地图中单个呼叫。
在我看来,唯一的时候,你会需要集合本身是线程安全的是:
的静态成员所有这些都可能是一个坏主意设计明智返回的句柄集合。
更好的方法是将集合本身设置为“私有”或“受保护”,并通过同步方法访问它。在静态成员的情况下,如果你需要这样做,Singleton将是更好的选择。
ConcurrentHashMap是way faster比散列表。这是并发,不只是同步。它同时承认多个读者/作者。
虽然没有这样的'并发'数组列表。根据您的需求,CopyOnWriteArrayList可能会或可能不会成为您需要的。
向量还没有被弃用。 – Champ 2010-09-12 08:44:00
Netbeans宣布Java 6的最新版本宣称Vector已被弃用......它一定是在其他地方发布的,因为我已经注意到几个月后需要找到它的替代品以及一些非已弃用的类仍然需要它。 – 2010-09-23 11:32:56