【问题标题】:why methods of Hashtable class are synchronized [closed]为什么Hashtable类的方法是同步的[关闭]
【发布时间】:2017-11-28 20:46:50
【问题描述】:

默认情况下,Web 应用程序容器会为每个请求处理/创建一个单独的线程。在这种情况下

  1. Web 应用容器如何为每个请求创建一个线程。
  2. 假设 T1 和 T2 是或多或少同时运行的请求/线程,下面的语句将为每个线程/请求创建一个新对象。 哈希表 ht=新哈希表(); 即每个线程都将获得自己的哈希表实例。

    t1 --> 将获得哈希表的实例/内存

    t2 --> 将获得哈希表的实例/内存

    因为,两个线程都没有共享...不确定为什么需要同步哈希表方法。

【问题讨论】:

  • 这是一个过度同步的遗留类。使用HashMap 而不是Hashtable
  • Hashtable 自 19 年前的 Java 1.2 以来基本上已经过时了。不要使用哈希表。它的 javadoc 说:从 Java 2 平台 v1.2 开始,这个类被改进为实现 Map 接口,使其成为 Java Collections Framework 的成员。与新的集合实现不同,Hashtable 是同步的。如果不需要线程安全的实现,建议使用 HashMap 代替 Hashtable。.
  • "不确定为什么需要同步哈希表方法。"您是在问为什么它们在哈希表类上同步,或者为什么您的代码在同步方法中访问它们?
  • 我的问题是“为什么 Hashtable 类中的方法是同步的”。当对 Web 应用程序的每个线程/请求都获得自己的哈希表副本时 (new Hashtable()) .. 我发现不需要同步 Hashtable 方法。
  • 仅仅因为它们是同步的并不意味着它们需要在您的特定情况下同步。它们是同步的,因为开发人员决定让 Hashtable 线程安全。

标签: java hashtable synchronized


【解决方案1】:

Hashtable 是一个非常古老的类,自 Java 1.0 以来就存在。虽然它不是正式的@Deprecated,但它被认为已过时,您可能应该改用HashMap。或者,正如javadoc 雄辩地说:

从 Java 2 平台 v1.2 开始,该类被改进为实现 Map 接口,使其成为 Java 集合框架的成员。与新的集合实现不同,Hashtable 是同步的。如果不需要线程安全实现,建议使用HashMap 代替Hashtable。如果需要线程安全的高并发实现,那么建议使用ConcurrentHashMap 代替Hashtable

【讨论】:

  • 我理解这个概念......但我试图在所问问题的背景下理解。
猜你喜欢
  • 2012-12-27
  • 1970-01-01
  • 2017-05-18
  • 2019-06-05
  • 2016-06-09
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多