0

如果这个类用在多线程环境中,说有100个线程同时调用这个方法。

案例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 ;
     }

}

请回答两种情况。

4

3 回答 3

0

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

一个友好的建议:使方法静态。Ans 在课堂上调用它。

于 2012-08-11T13:38:44.617 回答
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 的一部分,则将其设为静态,因为它可能永远不需要被覆盖。

于 2012-08-11T13:42:07.707 回答
0

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

于 2012-08-11T13:44:33.147 回答