为什么ArrayList和HashMap等类不同步?

时间:2012-06-20 18:04:31

标签: java arraylist synchronization hashmap

我正在更新一个旧项目,我想知道是否应该在IDE中删除一些标记为“过时”的对象。有问题的对象是Vector和Hashtable。我做了一些研究,似乎这些对象的新对应物 - ArrayList和HashMap - 基本相同,只是没有同步。

我的问题是,为什么要进行切换?我不是只是从我的应用程序中取走一点安全性以换取少量速度吗?似乎这不是一个巨大的决定,但我认为在做出决定之前我会看到它是否值得花时间。

谢谢!

4 个答案:

答案 0 :(得分:11)

  

我是不是只是从我的应用程序中取走了一些安全性以换取少量的速度?

如果您的唯一线程安全性依赖于VectorHashtable的同步,那么您几乎肯定会遇到麻烦。

通常,粗粒度的操作需要同步 - “对集合上的每个小操作进行同步并希望足够好”的方法几乎不是所需要的,所以为什么要轻微地使用它?

如果您在线程之间共享可变数据(例如集合),则需要仔细考虑如何这样做 - 使用VectorHashtable会给您一种错误的安全感。< / p>

答案 1 :(得分:2)

synchronized会导致严重的性能损失,并且通常不是实现并发性的最佳方法。

如果您需要线程安全的集合,请使用java.util.concurrent

中的集合

This article可能会有所帮助。

答案 2 :(得分:1)

我不是百分百肯定你正在获得你认为自己的'安全'。我通常发现我想自己做同步,而不是依赖于内置的东西(无论是Vector / Hashtable,还是Collections.synchronizedList(new ArrayList())/ Collections.synchronizedMap(new HashMap()))

我倾向于创建自己的锁定监视器并自己控制所有锁定。如果我不这样做,我往往忘记锁定复杂的多步操作而不注意它。我喜欢它如何强迫你考虑系统中的锁定 - 否则它变得容易'感觉'安全而事实上你不是。如果你做得不对,锁定就会让你陷入困境并成为一堆错误。值得额外考虑的是将锁定置于需要的位置,并了解锁定如何保护自己的访问权。

答案 3 :(得分:0)

Java API的早期类(例如VectorHashtableStringBuffer)已同步以使其具有线程安全性。不幸的是,即使使用单个线程中的这些集合,同步也会对性能产生很大的负面影响。

最好使用其新的非同步替代品:

  • ArrayListLinkedList而非Vector
  • Deque而非Stack
  • HashMap而非Hashtable
  • StringBuilder而非StringBuffer

代码示例

Vector empList = new Vector();

解决方案

ArrayList empList = new ArrayList();