【问题标题】:java synchronize collections selection for application requirementjava同步应用程序需求的集合选择
【发布时间】:2014-08-10 07:28:04
【问题描述】:

同步集合在java中是什么意思。如果我从 servlet 打印 jsp 页面中的用户记录,开发应用程序时选择哪个?在以下选项中选择哪个

  1. 哈希映射
  2. 哈希表

【问题讨论】:

  • 来自Hashtable javadoc:“如果不需要线程安全的实现,建议使用 HashMap 代替 Hashtable。如果需要线程安全的高并发实现,那么建议使用 ConcurrentHashMap 代替 Hashtable。”这个类来自Java2,经过改造,不要用=)

标签: java


【解决方案1】:

同步是控制多个线程访问任何共享资源的能力。

同步集合类HashtableVector,以及java.util.CollectionssynchronizedCollection(),synchronizedSet(), synchronizedSortedMap(),synchronizedSortedSet()static方法提供了一个基本的条件线程- Map、List 和 Set 的安全实现。

正如 Javadocs 所说 - 如果不需要线程安全实现,建议使用 HashMap 代替 Hashtable。如果需要线程安全的高并发实现,建议使用 ConcurrentHashMap 代替 Hashtable。

HashtableConcurrentHashMap 之间的区别:ConcurrentHashMap 只锁定 Map 的某些部分,而 Hashtable 在迭代时锁定整个 map

ConcurrentHashMap 专为并发和提高性能而设计,而本质上非同步的HashMap 可以通过使用Collections.synchronizedMap() 应用包装器来同步。

区别:ConcurrentHashMap 不允许空键或空值,而HashMap 允许空键。

【讨论】:

    【解决方案2】:

    同步集合是一个线程安全的集合,对于来自多个线程的并发更新是线程安全的。一般来说,在 Java 中:

    • 永远不要使用哈希表。请改用 ConcurrentHashMap。尽管 Hashtable 是线程安全的,但 ConcurrentHashMap 具有更好的性能并提供相同的并发保证。
    • 如果您不需要并发,请使用 HashMap(即地图将仅由一个线程使用)

    至于 JSP 问题,这真的取决于。如果您在多个线程之间共享同一个地图实例(例如,如果它在应用程序中是“全局的”),则使用 ConcurrentHashMap。如果您在请求中创建它,然后在完成后将其删除,并且它从未在另一个线程中使用过,那么只需使用 HashMap。

    this 问题中也有更多细节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 2010-09-18
      • 1970-01-01
      相关资源
      最近更新 更多