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

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



一只甜甜圈
浏览 73回答 2
2回答

胡子哥哥

面试官问我在单线程环境中使用像 Hashtable 这样的线程安全类的缺点?尽管大多数缺点都与性能有关,但还是有的。即使是单线程环境中也有多个线程(想想 GC、终结器、信号处理程序、JMX 等),因此该语言仍然需要遵守同步结构,例如synchronized,volatile和本机锁实现。这些语言特性会刷新或使内存缓存无效并影响代码重新排序,这两者都会显着影响整体运行时性能。如果不是那么为什么后面会引入非线程安全类?在单线程或多线程应用程序中,非线程安全对象的性能总是比线程安全对象好。处理本地 CPU 缓存内存的能力是现代硬件提供的主要速度提升之一。如果您不必接触主内存总线,则可以更快地执行操作数个数量级。同步结构降低了使用高速缓存的能力。最后,线程安全类通常在所涉及的数据结构以及它们在多线程应用程序中正确运行所需的逻辑方面都更加复杂。这意味着即使我们忽略同步结构,它也可能使用更多内存并且运行速度更慢,尽管这种情况的程度很大程度上取决于所讨论的特定类

蛊毒传说

它们在单线程环境中速度较慢。现代 JIT 在单线程环境中使用同步类非常有效,但并不完美。它们在多线程环境中要慢得多。如果您有不可变的集合,您可以安全地从不同的线程使用,但同步集合的工作速度会慢得多。[设计] 它的锁定语义大多是无用的,所以无论如何都需要额外的同步。你很少只需要读或写,大多数时候你先读然后写,你希望它是原子的。或者您想允许多个同时读取。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java