是否需要同步仅修改局部变量的线程?

时间:2011-12-05 11:21:31

标签: java synchronization

我对java同步机制有疑问。让我们采取以下代码 -

  class A {
     int instance=0;
     synchronized void met1() {
       instance=instance +1;
        ....
        instance = instance+2*3;

      }

在上面的方法met1中,我们需要在多线程环境中使其同步,因为它正在修改对象的实例变量。但是在这段代码中 -

class A {

     synchronized void met1() {
       local=local +1;
        ....
        local = local+2*3;

      }

方法met1正在修改一个局部变量,我认为这对于执行该方法的每个线程都是唯一的。所以在这种情况下,当一个线程只修改一个局部变量时,是否有必要使该方法同步?

7 个答案:

答案 0 :(得分:3)

假设变量是在met1内声明的,不,你不需要synchronized

答案 1 :(得分:0)

如果变量是真正的方法本地的,则不是 - 但是,您的示例代码实际上并未显示本地声明!所以不要在...周围传播这个例子。

答案 2 :(得分:0)

不,如果方法仅在本地范围内定义和使用变量,则不需要同步它。您只需要同步那些更改或提供可变状态访问权限的方法。

Java并发规则比你想象的要复杂得多,并且有很多陷阱因此非常值得阅读复杂的内容。 Goetz等人的“Java Concurrency in Practice”非常好(基本上来自马口)。

答案 3 :(得分:0)

没有。如果该方法仅修改局部变量和方法参数,则不需要同步该方法。你的类越无状态和不可变,你需要的同步就越少。

答案 4 :(得分:0)

不,没有必要同步一个只修改局部变量但不改变对象状态的方法

答案 5 :(得分:0)

您无需担心多线程环境中的局部变量。您无需使其同步。但是在您的代码中,变量“local”未在met1()中定义为局部变量。

答案 6 :(得分:0)

在你的第二个例子中,local不完全是本地的,因为你没有在met1中声明它。可能你的意思是:

 synchronized void met1() {
   int local = 0;
   // ...
   local=local +1;
    ....
    local = local+2*3;

  }

然后是的,你是对的,因为每个方法调用都发生在调用线程的堆栈上,方法局部变量只存在相应的线程堆栈而不需要同步访问。