单例模式和性能

4

你好:我有一个多线程Java程序。其中有很多单例模式。我想知道在多线程程序中使用单例模式是否会降低性能,特别是吞吐量方面的表现。 有些单例只是一个对象,而有些单例则包含了ConcurrentHashMap和/或AtomicInteger。

3个回答

9
如果你的单例是不可变的,那么它们就不会导致性能下降。
然而,正如你所说,如果你的代码中有并发(使用"synchronized")数据结构单例,那么与非并发数据结构相比,性能将会下降。
基本上,将对象视为带有一些方法的数据持有者,现在假设你的代码中有一个链表且许多线程正在同时运行并修改该链表。类比这个例子,你的单例数据结构是数据持有者,许多线程都试图更新它,并且系统通过锁保持一致。
长话短说,我认为在并发系统中拥有单例不会对性能产生显著影响,除非它们保存了多个线程更新的数据结构。

2
如果您在任何对象上进行同步,所有线程都必须等待获取该对象的锁,然后执行同步代码块。其他线程将排队等待释放锁。据推断,对单例实例或单例类进行同步将导致性能下降。简单地说,性能降低的因素是锁定的颗粒度;如果您在具有n个方法的单例上进行同步,则所有线程只需等待一个锁,即使它们尝试执行n个不同的方法。
如果可能的话,请重新设计您的应用程序,以避免在性能热点上对单例进行同步。鉴于您正在使用专为并发访问设计的类,这可能不是问题。这比尝试减少对单例的锁争用要好。
另一方面,如果您根本没有对单例进行同步(故意这样做,因为没有共享数据),则使用单例不会导致性能下降。

0
单例模式的唯一开销是同步开销,因为单例对象通常具有状态。如果它们没有状态,那么它就像任何其他Java方法一样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接