2010-08-30 86 views
2

我有一个静态的方法如下:静态方法导致的问题

public static void writeArticle(TypeA typeA, TypeB typeB) { 
    AWriter writer = AFactory.getWriter("aWriter"); 
    Article article = writer.newArticle(); 

    /* PARAMETER WRITE START */ 

    article.set("title", typeA.getTitle()); 
    article.set("author", typeB.getName()); 
    article.set("age", typeB.getAge()); 
    // … 
    /* more set statments here */ 
    writer.write(article); 
} 

可以将这个方法会导致作家会写值混合文章有问题?也就是说,当2个类(Class A和ClassB)调用这个方法的时候,Article会从ClassA中获得一些typeA值,而从ClassB中获得一些typeA值?

+0

你有问题还是理论上的问题?如果你有问题,请描述它,而不是检查你的AWriter类... – pgras 2010-08-30 09:48:07

+0

嘿pgras,放松。是的,我确实有一个问题。就像你'打字'一样。只是开玩笑的人。是的,我在那里问的问题确实发生在我的公司,而我试图了解它是否可能。我确实需要在标题上添加一个问号。 – sarahTheButterFly 2010-08-30 11:36:21

回答

5

不是。你为什么认为来自两个不同电话的争论会混淆?没有理由认为他们会这样做。

如果这是一个多线程程序,您应该小心在线程之间共享对象;如果这些对象具有可变状态(可以更改的成员变量),则应该注意两个线程不会同时修改状态。

+0

实际上涉及多线程。我提到的ClassB实际上是访问实用程序静态方法的应用程序,ClassB使用多线程逻辑,它也调用该方法。 ClassA是运行在同一平台上的另一个应用程序,它没有多线程逻辑。我只有线程的基本知识,所以我在这里提出问题并寻求一些指导。 – sarahTheButterFly 2010-08-30 11:42:46

+0

你应该在适当的地方同步。这不是一个小问题,可以用两句话来解释......一个很好的教程可以在这里找到:http://download.oracle.com/javase/tutorial/essential/concurrency/ – Jesper 2010-08-30 13:33:14

4

无论何时你说static,你都不会谈论实例方法调用。应始终使用类名称调用静态方法。

静态方法在实例级完全隔离。尽管它可能会写一个混合值,但它是你想要它写的不是它?

0

不会的。否则它会是地狱。

+0

你认为这是一个有用的回答? – 2010-08-30 07:39:52

+0

@seanizer:对我来说似乎是一个好的答案。答案总是不必精心制作。事实上,他表达了要传达的东西。 – bragboy 2010-08-30 07:41:06

+0

@Bragboy:那么为什么你写了一个更有帮助,更详细的答案呢? – 2010-08-30 08:05:49

0

只有当这两个呼叫都被访问并改变了公共状态时(例如,假定定义该方法的类别被称为ArticleWriter,则它们都将读取并更改ArticleWriter的静态字段。

0

这对你的代码来说是不可能的。 typeA有方法getTitletypeB有方法getName。哪些领域混淆了?

0

这是从这段代码中不可知的。要解决的第一个问题是该方法是否可能同时从两个不同的线程中调用。如果是这样,问题很可能是两个线程同时修改同一个对象(文章或作者)。解决这个问题的最简单方法是同步writeArticle()。

+1

是的,我有点知道解决方案。我只是想了解整个画面。所以两个线程正在修改哪个对象。他们只是传递参数,他们没有分享任何东西。我怀疑的唯一地方就是写作。或者你认为这篇文章会有混合价值吗? – sarahTheButterFly 2010-08-30 11:52:03

+0

就像我说过的,它从这段代码片段中是不可知的。我的猜测,基于语义,问题在于: AFactory.getWriter(“aWriter”); 返回对同一个AWriter实例的引用,这意味着多个线程将共享该实例。如果你要让多个线程同时运行相同的代码,最安全的事情是让它们使用它们需要的所有对象的单独实例。如果他们*必须*有权访问同一个对象,那么您需要确保对该对象的访问已正确同步。 – user434722 2010-09-03 08:41:21

3

不,方法参数和局部变量是线程安全的只要它们不引用共享对象