使HashTable方法同步的驱动因素或设计方案是什么?
此link表示HashTable已同步,因为其方法已同步。但是,我想知道“为什么”这些方法同步的原因?
只是提供一些同步功能吗?开发人员可以通过同步技术显式处理竞争条件。为什么要为HashTable提供此功能?
答案 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年前)类型。