嗨:我有一个多线程Java程序。有很多单身人士。我想知道单例是否会降低多线程程序的性能,尤其是吞吐量。 一些Singleton只是一个对象,一些singleton是concurrentHashmap和/或atomicinteger。
答案 0 :(得分:8)
如果你的单身人士是不可改变的,那么他们就不会导致表现下降。
然而正如您所说,如果您的代码中存在并发(synchronized
)数据结构单例,那么与非并发数据结构相比,您的性能将会降低。
基本上,将对象视为具有某些方法的数据持有者,现在认为您的代码中有一个链表,并且许多线程同时运行并修改该链表。与此示例类似,您的单例数据结构是数据持有者,许多线程正在尝试更新它,并且系统与锁保持一致。
长话短说,我不认为在并发系统中拥有单例将在性能上产生显着差异,除非它们保持由多个线程更新的数据结构。
答案 1 :(得分:2)
如果在任何对象上进行同步,则在执行synchronized代码块之前,所有线程都必须等待获取该对象的锁定。其他线程将排队,等待锁被释放。通过推理,对单例实例或单例类进行同步将导致性能下降。简单来说,性能下降是锁定粒度的一个因素;如果你在具有n个方法的单例上进行同步,那么所有线程都必须只等待一个锁,即使它们试图执行n种不同的方法。
如果可以的话,重新设计你的应用程序,不要在性能热点上同步单例。鉴于您使用的是为并发访问而设计的类,这可能不是问题。这比尝试减少单例上的锁争用更好。
另一方面,如果你根本没有同步单身(有意识地,因为没有共享数据),那么使用单例不会导致性能下降。
答案 2 :(得分:0)
拥有单例的唯一开销是同步开销,因为单例对象通常具有状态。如果他们没有状态,那就像任何其他java方法一样。