2011-06-07 36 views
3

嗨:我有一个多线程的Java程序。有很多单身人士。我想知道singleton是否会降低多线程程序的性能,特别是吞吐量。一些Singleton只是一个单一的对象,一些单例是并发的Hashmap和/或原子整数。单身和性能

回答

8

如果你的单身人士是不可变的,那么他们不会导致性能下降。然而,正如你所说,如果在你的代码中有并发(​​)数据结构单例,那么与非并发数据结构相比,你的性能会下降。

基本上,将对象视为数据持有者,并在其上使用一些方法,现在认为代码中有链接列表,并且许多线程正在同时运行并修改该链接列表。类似于这个例子,你的单例数据结构是数据持有者,许多线程正试图更新它,系统与锁保持一致。长期以来,我并不认为在并发系统中使用单例将会使性能发生显着变化,除非他们持有由多个线程更新的数据结构。

2

如果您在任何对象上进行同步,则所有线程必须等待才能在执行同步代码块之前获取该对象的锁定。其他线程将排队,等待锁被释放。通过推论,在单例实例或单例类上同步将导致性能下降。用简单的话来说,性能的下降是锁定粒度的一个因素;如果你在一个有n个方法的单例上进行同步,所有线程将不得不等待一个锁,即使他们试图执行n个不同的方法。

如果可以,请重新设计您的应用程序,以免在性能热点中的单身人士身上同步。鉴于您正在使用专为并发访问而设计的类,这可能不成问题。这比试图减少对单例的锁争用要好得多。另一方面,如果你根本不同步单身人士(有意,因为没有共享数据),那么使用单身人士不会导致性能下降。

0

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