2012-02-08 69 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