当我们说Hashtable或Vector是同步的时候意味着什么?

时间:2010-04-08 16:18:28

标签: java

问题说明了一切,只是想知道,在一次采访中,当你问他们时,你会说什么,“哈希表或矢量被同步的实际意义是什么?”

4 个答案:

答案 0 :(得分:14)

实际上它意味着两件事:

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

答案 1 :(得分:8)

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:0)

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

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

即使将它们与一个或多个线程一起使用,也可能不如使用非同步版本和仅同步自然部分那样具有更高的性能。