【问题标题】:Why are classes such as ArrayList and HashMap not synchronized?为什么 ArrayList 和 HashMap 等类不同步?
【发布时间】:2012-06-20 18:04:30
【问题描述】:

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

我的问题是,我为什么要切换?我不是只是从我的应用程序中拿走了一点安全性以换取少量的速度吗?无论哪种方式,这似乎都不是一个重大的决定,但我想我会先看看是否值得花时间再做决定。

谢谢!

【问题讨论】:

  • 如果这些对象不会被多线程/并发代码触及,您可能不需要同步(因此您不必因synchronized 块而招致可能的性能损失)。 VectorHashtable 在 Java API 中没有被弃用/废弃,您可以在它们或它们的非同步对应物之间进行选择(它们分别公开相同的接口)。同样,在 Java 5 和更高版本中,您可以访问 java.util.concurrent,如果您需要并发访问容器,它可能具有性能更好的容器。
  • 如果需要,您可以随时使用Collections.synchronizedList(); 包装它,但请先查看 Jon 的回答

标签: java arraylist synchronization hashmap


【解决方案1】:

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

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

通常,需要同步粗粒度操作 - “同步集合上的每个小操作并希望它足够好”的方法几乎从来都不是必需的,那么为什么要接受它的小打击呢?

如果您在线程之间共享可变数据(例如集合),则需要仔细考虑如何执行此操作 - 使用 VectorHashtable 会给您一种错误的安全感。

【讨论】:

【解决方案2】:

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

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

This article 可能会有所帮助。

【讨论】:

    【解决方案3】:

    我不能 100% 确定您是否获得了您认为的“安全性”。我通常发现我想自己进行同步,而不是依赖内置的东西(无论是 Vector/Hashtable,还是 Collections.synchronizedList(new ArrayList())/Collections.synchronizedMap(new HashMap())) .

    我倾向于创建自己的锁定监视器并自己控制所有锁定。如果我不这样做,我往往会忘记锁定复杂的多步骤操作而不会注意到它。我喜欢它如何迫使您考虑系统中的锁定 - 否则实际上您不是很容易“感觉”安全。如果你做的不好,锁定真的会让你一头雾水,成为一堆错误。将锁定放在需要的地方并了解您的锁定如何保护自己的访问权限是值得额外考虑的。

    【讨论】:

      【解决方案4】:

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

      最好使用他们新的非同步替换:

      • ArrayListLinkedList 而不是 Vector
      • Deque 而不是 Stack
      • HashMap 而不是 Hashtable
      • StringBuilder 而不是 StringBuffer

      代码示例

      Vector empList = new Vector();
      

      解决方案

      ArrayList empList = new ArrayList();
      

      【讨论】:

        猜你喜欢
        • 2017-05-18
        • 2012-03-10
        • 1970-01-01
        • 1970-01-01
        • 2011-06-26
        • 2016-06-04
        • 2015-09-06
        • 1970-01-01
        • 2017-10-22
        相关资源
        最近更新 更多