【问题标题】:What does it mean when we say Hashtable or Vector is synchronized?我们说 Hashtable 或 Vector 是同步的是什么意思?
【发布时间】:2011-02-05 19:02:58
【问题描述】:

这些问题说明了一切,只是想知道,在采访中,当他们问你“Hashtable 或 Vectors 被同步实际上意味着什么?”时,你会怎么说?

【问题讨论】:

  • 我会回答,这意味着您无缘无故地使用了近十年前的类,您应该使用集合框架中的现代等效类。不过,这超出了问题的重点。
  • 你能说出一些现代的等价物吗
  • HashMapArrayList 分别。
  • 顺便说一句,那些(HashMap and ArrayList)是不同步的现代等价物。
  • 你可以让它们分别与Collections#synchronizedMap()Collections#synchronizedList()同步:java.sun.com/javase/6/docs/api/java/util/Collections.html

标签: java


【解决方案1】:

实际上它意味着两件事:

  1. 除非您将在线程之间共享它们(如果不只是使用 HashMap 或 ArrayList),否则不要使用它们。
  2. 如果您在线程之间共享它们,请检查它们实际实现的同步策略是否足以使您的程序线程安全(因为某些同步的存在并不能说明类的全面并发行为)。李>

【讨论】:

    【解决方案2】:

    这意味着对底层数组/集合的访问(添加、获取、设置、放置、删除等)都是同步的。它不能同时发生。实际上,所有访问都布置在先进先出 (FIFO) 队列中。仅当当前没有人(阅读:没有其他线程)正在访问该对象时,队列中的下一个(线程)才可以访问它。

    【讨论】:

    • 多个线程可以保存对同步集合的引用,对吗?只是这些线程中只有一个线程可以同时(添加、获取、设置、放置、删除等),对吗?
    • '先进先出 (FIFO) 队列'。不,没有指定排队。未指定谁获得下一个访问权限:可能是最高优先级的等待线程。
    【解决方案3】:

    在任何给定时间,只有一个执行线程可以改变容器的状态。

    如果容器未同步,多个执行线程可能会尝试同时更改容器的状态。这当然很可能最终导致容器的内部状态被破坏,即不是你想要的。

    原始的 Java 容器,例如出于安全原因,java.util.Vector 和 java.util.Hashtable 都是同步的。但是默认同步访问的缺点是不需要同步的用例将遭受同步的性能损失。所以现在 Java 也附带了不同步的容器,例如ArrayList 和 HashMap。

    【讨论】:

      【解决方案4】:

      这意味着一次只能有一个线程访问它。

      如果您在只使用线程的程序中使用它可能会出现问题,因为检查谁拥有监视器(哪个线程试图使用它)的过程仍然会浪费宝贵的处理时间。

      即使将它们与一个或多个线程一起使用,其性能也可能低于使用非同步版本并仅同步危险部分的性能。

      【讨论】:

        猜你喜欢
        • 2011-10-18
        • 1970-01-01
        • 1970-01-01
        • 2010-11-08
        • 1970-01-01
        • 2020-12-31
        • 2014-09-23
        相关资源
        最近更新 更多