2011-06-07 21 views
3

嗨:我有一個多線程的Java程序。有很多單身人士。我想知道singleton是否會降低多線程程序的性能,特別是吞吐量。一些Singleton只是一個單一的對象,一些單例是併發的Hashmap和/或原子整數。單身和性能

回答

8

如果你的單身人士是不可變的,那麼他們不會導致性能下降。然而,正如你所說,如果在你的代碼中有併發(​​)數據結構單例,那麼與非併發數據結構相比,你的性能會下降。

基本上,將對象視爲數據持有者,並在其上使用一些方法,現在認爲代碼中有鏈接列表,並且許多線程正在同時運行並修改該鏈接列表。類似於這個例子,你的單例數據結構是數據持有者,許多線程正試圖更新它,系統與鎖保持一致。長期以來,我並不認爲在併發系統中使用單例將會使性能發生顯着變化,除非他們持有由多個線程更新的數據結構。

2

如果您在任何對象上進行同步,則所有線程必須等待才能在執行同步代碼塊之前獲取該對象的鎖定。其他線程將排隊,等待鎖被釋放。通過推論,在單例實例或單例類上同步將導致性能下降。用簡單的話來說,性能的下降是鎖定粒度的一個因素;如果你在一個有n個方法的單例上進行同步,所有線程將不得不等待一個鎖,即使他們試圖執行n個不同的方法。

如果可以,請重新設計您的應用程序,以免在性能熱點中的單身人士身上同步。鑑於您正在使用專爲併發訪問而設計的類,這可能不成問題。這比試圖減少對單例的鎖爭用要好得多。另一方面,如果你根本不同步單身人士(有意,因爲沒有共享數據),那麼使用單身人士不會導致性能下降。

0

具有單例的唯一開銷是同步開銷,因爲單例對象通常具有狀態。如果他們沒有狀態,它就像任何其他的java方法。