2012-02-08 68 views
0

所以我們可以說我有一個用Spring創建的單例MyWebService。 MyWebService的目標是返回一個MyObject。單線程安全的線程

編輯:當我交出一個非線程安全的Object SomeBuilder並用它創建對象MyObject時,我認爲這很危險。但是:如果我交工廠,在每次調用每個方法時都要實例化一個新的SomeBuilder對象,我想我是安全的?

@Webservice 
public class MyWebService { 
private final SomeFactory someFactory; 
private final SomeBuilder someBuilder; 

    public MyWebService(SomeFactory someFactory, SomeBuilder someBuilder){ 
    this.someFactory=someFactory; 
    this.someBuilder=someBuilder; 
    } 
    public MyObject getSomeObject(SomeArgs someArgs){ 
    //this is threadsafe? 
    SomeBuilder newlyCreatedBuilder= someFactory.createObjectBuilder(); 
return newlyCreatedBuilder.getMyObject(someArgs); 


//where as this is dangerous? 
return someBuilder.getMyObject(someArgs); 

} 
} 
+0

[Singleton Considered Evil](http://c2.com/cgi/wiki?SingletonsAreEvil) – 2012-02-09 13:11:45

+0

@Martin Spamer我認爲單例是一個反模式,只要它是用手工實現的單例模式。使用它與依賴注入是一個不同的故事。例如。避免單例中的類的實例字段。並寫作webservices不作爲singeltons - 如果可能的話,請給我一個提示 – Toskan 2012-02-13 15:00:36

+1

作爲一般規則構建對象的要求。如果構建該對象的開銷很大,則從資源池中查找它,如果構建起來非常昂貴或需要持久化使用EJB。 – 2012-02-14 18:02:36

回答

0

是的,只要其他實現也是線程安全的,就可以在單例中使用對工廠或任何其他Java類的引用。

+0

問題是:在我的例子中,MyObjectBuilder是不是線程安全的情況下使用工廠是否安全?據我的理解,我在每次訪問getMyObject時創建一個新對象MyObject。 getMyObject從一個方法作用域實例化MyObject Object:MyObjectBuilder,因此在我看來,它是線程安全的。而使用創建MyObject並由所有訪問共享的字段(someClass)的不同方法似乎不是線程安全的。我更新了我的問題 – Toskan 2012-02-13 15:06:36

+0

我被建議回顧我的問題:您的答案只是說 - 「如果您使用的所有內容都是線程安全 - 你將是線程安全的「。這是曳,先生;-) – Toskan 2012-08-30 12:45:59