2012-08-11 80 views
0

如果此类用于多线程环境并且说100个线程同时调用此方法。我们是否需要同步add()方法这个类?

案例1:实例方法

public class test { 

    public int add(int a , int b){ 

    return a+b ; 
    } 

} 

的情况下2:静态方法

public class test { 

    public static int add(int a , int b){ 

    return a+b ; 
    } 

} 

请回答这两种情况。

+0

可以请你理解意图 - 语法在这里并不重要。 – 2012-08-11 13:39:29

+0

它不是语法..它是语法! – Nishant 2012-08-11 13:40:21

回答

0

由于您没有使用任何状态/实例变量,因此您不需要synchronize方法或对象。

友好建议:使方法静态。 Ans在课堂上给它打电话。

+0

感谢您的回复。但IBM的一个白痴开始同步它;) – 2012-08-11 13:40:33

+0

请不要责怪整个公司,因为少数人犯了一个错误...... IBM发布了真棒代码......他们有一些最好的电脑工程师。如果此答案解决了您的问题,请将其标记为已回答,方法是单击此答案旁边的标记。 [见这里如何](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。如果你喜欢答案,你也可以通过点击答案旁边的向上箭头来进行投票。 – Nishant 2012-08-11 13:43:59

0

它不需要任何同步,因为所有的变量都是本地的。即在任何呼叫者之间实际上不分配变量。

如果你这样做了,你需要同步,因为var c是共享的。在最后的'返回c'中检索c之前,另一个线程可能已经修改了它。

public class test { 

    int c = 0; 

    public int addKeep(int a , int b){ 
      c = a + b; 
      return c; 
    } 
} 

其他答案在这里说,使其为静态。那么这取决于你需要做什么。如果add(int a,int b)是子类可以覆盖的行为,则将其作为实例方法保留。如果它是Math.class本身的一部分,那么将其设为静态,因为它可能永远不需要被超越。

0

如果对象是可变的,并且您正在执行读取更新操作,那么只需要为getter和setters(即mutating方法)使用同步块。

+0

你正在回答你自己的问题? :)如果您有其他信息,请编辑您的问题。 – Nishant 2012-08-11 13:45:38