2009-01-17 92 views
12

Java开发中强调的一个模块始终使用Vector上的ArrayList。矢量已弃用。这可能是事实,但Vector和Hashtable具有同步的优点。在Java中使用Hashtable,Vector或HashMap或ArrayList

我正在使用面向并发的并行应用程序,使用像Vector一样同步的对象会不会有好处?看起来他们有他们的位置?

+0

向量还没有被弃用。 – Champ 2010-09-12 08:44:00

+0

Netbeans宣布Java 6的最新版本宣称Vector已被弃用......它一定是在其他地方发布的,因为我已经注意到几个月后需要找到它的替代品以及一些非已弃用的类仍然需要它。 – 2010-09-23 11:32:56

回答

17

Vector和Hashtable的问题在于它们只在本地同步。它们不会在并发应用程序中破坏(如在损坏的数据中),然而,由于本地同步(例如get是同步的,但只有在得到返回时),您仍然希望执行自己的同步,无论如何,作为内容的迭代。现在,即使你的put方法需要一些额外的同步来配合迭代同步,并且你最终会遇到你的Hashtable/Vector被双重同步的情况。

+0

究竟哪些不正确? – falstro 2009-01-17 18:28:37

13

如果您需要同步ArrayList或HashMap,可以将它们包装起来。

List list = Collections.synchronizedList(new ArrayList(...)); 
Map m = Collections.synchronizedMap(new HashMap(...)); 

个人而言,我觉得在这些集合重线程代码不是非常有用的“同步”的方法。有一些更新的集合可以提供更多帮助,但大多数情况下,我发现自己正在创建自己的同步对象并在其周围进行同步,或者使用java.util.concurrent中的新锁定

8

同步有它的位置,但那不是只有VectorArrayList之间的区别。 Vector每次超过其容量时,其内部存储阵列增长一个固定的数量,而ArrayList增长一个固定的因子,这通常是一个更好的方法(因为它给出了O(1)的amortized cost附加项目)。

还要注意的是Collections.synchronizedList()可以用来创建任何List实现同步视图,这样你就不必被绑定到的Vector的特性(您可能需要例如同步LinkedList)。

0

在我看来,唯一的时候,你会需要集合本身是线程安全的是:

  • 如果集合可见从类的外部(公共或默认范围内)
  • 如果你从一个方法
  • 如果集合类

的静态成员所有这些都可能是一个坏主意设计明智返回的句柄集合。

更好的方法是将集合本身​​设置为“私有”或“受保护”,并通过同步方法访问它。在静态成员的情况下,如果你需要这样做,Singleton将是更好的选择。

17

ConcurrentHashMapway faster比散列表。这是并发,不只是同步。它同时承认多个读者/作者。

虽然没有这样的'并发'数组列表。根据您的需求,CopyOnWriteArrayList可能会或可能不会成为您需要的。

相关问题