为什么Java的HashTable是同步的?

时间:2017-04-10 13:04:19

标签: java multithreading concurrency synchronization hashtable

使HashTable方法同步的驱动因素或设计方案是什么?

link表示HashTable已同步,因为其方法已同步。但是,我想知道“为什么”这些方法同步的原因?

只是提供一些同步功能吗?开发人员可以通过同步技术显式处理竞争条件。为什么要为HashTable提供此功能?

2 个答案:

答案 0 :(得分:7)

请记住:这些类是在“年龄”之前创建的 - 当您检查Hashtable的javadoc时,您会发现“自Java 1.0以来”;而HashMap说“1.2”!

当时,Java试图与C和C ++等语言竞争;通过提供独特的卖点,如“内置并发”。

但人们很快发现,在多线程环境中使用容器时,最好能够同步容器!

所以我的(更多基于意见的)答案是:在这个类最初设计的时候,人们认为“可以由多个线程使用”的要求比“给出最佳性能”更重要。 / p>

因为Java“广告”如:“用它来编写多线程写入一次运行代码”。当给予人们的默认容器类需要额外的外部包装以实际使它们“多线程”准备就绪时,这种方法很快就会失败。

这些年来,Java背后的人们开始明白需要“更细粒度”的解决方案。因此,核心集合类不会同步以避免相应的性能命中。含义:集合的默认值是“不受保护”;因此,当您的要求是“多线程”正确性时,您必须提出一些想法。

相同的“列表”顺便说一句:矢量是同步的; ArrayList不是。

答案 1 :(得分:1)

我们无法告诉你原因。那些在二十年前设计Java的人也许可以。这不是一个有用的问题。假设你真的想询问java.util.Hashtable而不是虚构的HashTable类型,请记住它已经淘汰了19年。十九年!不要使用它。它(和Vector)具有以下优点:同步和非同步的替换类型不会携带。使用现代(截至19年前)类型。