在单线程环境中使用像Hashtable这样的线程安全集合类有什么缺点吗?

时间:2019-04-25 07:36:12

标签: java multithreading collections hashtable

面试官问我有关在单线程环境中使用像Hashtable这样的线程安全类的缺点吗?有什么缺点吗?如果不是,那以后为什么要引入非线程安全类呢?

2 个答案:

答案 0 :(得分:1)

  1. 它们在单线程环境中速度较慢。现代JIT在单线程环境中使用同步类非常有效,但并不完美。
  2. 它们在多线程环境中要慢得多。如果您有不可变的集合,则可以从不同的线程安全地使用它,但是同步的集合工作起来会慢得多。
  3. [design]它的锁定语义几乎没有用,因此无论如何都需要额外的同步。您很少只需要读或写,大多数时候先读又写,并且希望它是原子的。或者您想允许多个同时读取。

答案 1 :(得分:0)

  

面试官问我有关在单线程环境中使用像Hashtable这样的线程安全类的缺点吗?

尽管大多数缺点都围绕性能而存在。即使单线程环境中也有多个线程(例如GC,终结器,信号处理程序,JMX等),因此该语言仍然需要遵循synchronizedvolatile和本机锁实现。这些语言功能会刷新或使内存缓存无效,并影响代码的重新排序,这两者都会极大地影响整体运行时性能。

  

如果不是,那么为什么以后会引入非线程安全类?

在单线程或多线程应用程序中,非线程安全对象的性能始终优于其线程安全对象。处理本地CPU缓存的能力是现代硬件提供的主要速度提升之一。如果您不必伸向主存储器总线,则可以更快地执行几个数量级的操作。同步结构会降低缓存的使用能力。

最后,线程安全类通常在涉及的数据结构以及使它们在多线程应用程序中正确运行所需的逻辑方面更为复杂。这意味着,即使我们忽略了同步结构,尽管情况在很大程度上取决于所讨论的特定类,但它可能会占用更多的内存并运行得更慢。