当我们说Hashtable或Vector同步时,它意味着什么?

问题就是这么说,只是想知道,在一次采访中,当他们问你时,你会说什么,“Hashtable或Vector被同步的实际意义是什么?”

实际上它意味着两件事:

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

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

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

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

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

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

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

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