2009-10-23 90 views
1

我正在使用MULE和Spring的項目。在上下文中,我們創建提供服務的bean。所有的bean基本上都是線程安全的單例。這是一種流行/推薦的書寫服務方式嗎?彈簧+線程安全單例

+0

我發現一個網址http://blog.webscale.co.in/?p=64說彈簧注射不是線程安全的!矛盾!!任何人都可以請幫忙嗎? – 2011-02-15 13:19:50

回答

2

默認情況下,Spring中的bean將是一個單例,這是您描述的一種非常常見的情況。

0

可能是有問題的表現明智。如果你有很多線程在爭奪相同的服務。該bean被定義爲線程安全的,因此來自不同線程的訪問將被有效地序列化。

+0

如果你在某種共享狀態下做同步塊,這真的只是一個問題。如果您沒有對併發進行任何鎖定,則使用單例的性能差異可以忽略不計。 – 2009-10-23 16:37:10

+0

這是我想探討的問題; AFAIK嘗試訪問單身人士將被序列化。它是一個線程安全的單例的事實意味着不需要鎖定。所以,因爲bugspy.net建議訪問將被序列化。當然這是可擴展性的抑制因素? – user195166 2009-10-25 23:10:56

+0

我不確定Spring對單身人士的訪問是否自動進行序列化。檢查這個。我認爲這是單身人士的責任,要序列化並鎖定任何需要被鎖定的信息 – GabiMe 2009-10-25 23:19:34

0

在我們的RESTful服務,我們建立了我們的入口點的

@com.sun.jersey.spi.resource.PerRequest

基礎上,

@org.springframework.context.annotation.Scope("request")

這使我們的吞吐量上升,但我們監測,以確保GC是好的足以不要臃腫的應用程序。

Spring單例本質上是線程安全的,加上這是默認範圍 - 在我們所有的Web應用程序中使用它們時表現都非常好。

+0

我對Spring很新,所以請忍受一下。當你說「Spring singletons本質上是線程安全的」。我是否仍然必須以線程安全的方式在bean中編寫我的代碼,以確保它是真實的,即我不應該創建任何模塊級變量的新實例,因爲下一個線程可能會使用它們? – user195166 2009-10-25 23:29:57

+1

那麼,如果你使用Spring的「依賴注入」,那麼你不用擔心生命週期,因此你不需要手動實例化bean - 這就是爲什麼你有Spring。所以,基本上你告訴Spring類'A'需要注入類'B',而Spring創建'A'和'B'並將'B'的一個實例注入到'A'的一個實例中。默認情況下,Spring創建2個bean的** singleton **實例,但是你的類需要本質上是線程安全的,即它們應該是無狀態的。如果你需要保持狀態,你可能需要原型,請求或會話範圍。 – 2009-10-26 04:36:26

+0

看看這個範圍http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-scopes – 2009-10-26 04:38:48