【问题标题】:Does a thread that Only modifies a local variable need to be synchronized?只修改局部变量的线程是否需要同步?
【发布时间】:2011-12-05 11:21:31
【问题描述】:

我对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 方法正在修改一个局部变量,我认为这对于执行该方法的每个线程都是唯一的。那么在这种情况下,当一个线程只修改一个局部变量时,是否需要让方法同步呢?

【问题讨论】:

    标签: java synchronization


    【解决方案1】:

    假设变量在met1 中声明,不,你不需要synchronized

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        如果变量是真正的方法局部变量,则不会——但是,您的示例代码实际上并未显示局部声明!所以不要到处传播这个例子......

        【讨论】:

          【解决方案4】:

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

          Java 并发规则比您想象的要复杂,并且有很多陷阱,因此非常值得一读其中的复杂性。 Goetz 等人的“Java Concurrency in Practice”非常好(基本上是从马口中出来的)。

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

              不,不需要同步一个只修改局部变量而不改变对象状态的方法

              【讨论】:

                【解决方案7】:

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

                【讨论】:

                  猜你喜欢
                  • 2011-10-30
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-01-07
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多