2013-05-31 29 views
1

朋友,我讀春季3 - spring容器給辛格爾頓豆,默認情況下,當我們創建它們使用構造函數。但是如果我們使用工廠方法,那麼它應該以只返回單個bean的方式實現。頁碼37與標題的Spring bean創建在行動</p> <p>它說工廠方法和違約Singleton模式

CREATING BEANS THROUGH FACTORY METHODS 

因此,作者不得不通過以下代碼維護線程安全。否則,有兩個併發線程可能會創建兩個Spring Bean實例。

package com.springinaction.springidol; 
    public class Stage { 

     private Stage() { 
      } 

    private static class StageSingletonHolder { 

     static Stage instance = new Stage(); 
       } 

     public static Stage getInstance() { 
     return StageSingletonHolder.instance; 
       } 

    } 

靜態getInstance()方法在每次調用時返回相同的實例。 (對於螺紋 安全,的getInstance()採用一種稱爲「按需保持器初始化」來創建單個實例的技術。)

然後,它使用XML

 <bean id="theStage" 
     class="com.springinaction.springidol.Stage" 
      factory-method="getInstance" /> 

申報的getInstance作爲工廠方法。

我對此理解清楚。不過,出於好奇,我想如果我通過移除該靜態初始化

package com.springinaction.springidol; 
     public class Stage { 
     private Stage() { 
       } 

       public static Stage getInstance() { 
       return new Stage(); 
       } 
      } 

移除級舞臺這個線程安全的概念,那麼就可以通過兩個同步線程,以具有類舞臺的多個實例。我知道這只是一種可能性。在這種情況下,當Thread 1調用Spring容器(ApplicationContext)實例的getBean(「theStage」)方法時可能會出現這種情況。它發現沒有這樣的bean的實例。在線程2接管它的同時,它也發現沒有這樣的bean的實例。現在兩個線程都創建兩個不同的Spring bean,因爲工廠方法不是線程安全的。

如何增加兩個線程通過修改的getInstance方法(現在不是線程安全)返回不同實例的可能性如何增加?

請幫助

回答

0

這怎麼可能增加兩個線程通過修改getInstance方法(也就是現在的不 線程安全)

唯一的情景,這回 不同實例將會發生的是,如果該bean使用延遲加載。否則spring將在啓動時創建bean,並且每當線程請求Stage的實例時,Spring將返回它已有的一個實例。

我還沒有讀過這本書,但我想作者正在使用StageSingletonHolder 100%確定這個bean永遠不會在當前類加載器中擁有另一個實例。然而,單身人士是java中的謊言,因爲你可以有多個類加載器,因此可以有多個單例。

這篇很好的文章解釋了這個:http://tech.puredanger.com/2007/07/03/pattern-hate-singleton/

相關問題