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

Java 只修改局部变量的线程是否需要同步?,java,synchronization,Java,Synchronization,我对java同步机制有疑问。让我们看下面的代码-- 在上面的met1方法中,我们需要使它在多线程环境中同步,因为它正在修改对象的实例变量。但是在这段代码中-- met1方法正在修改一个局部变量,我认为它对于执行该方法的每个线程都是唯一的。因此,在这种情况下,当线程仅修改局部变量时,是否有必要使方法同步?假设变量在met1中声明,则不需要synchronized假设变量在met1中声明,则不需要,如果变量是真正的方法局部变量,则不需要进行synchronized,但是,示例代码实际上并不显示局部声

我对java同步机制有疑问。让我们看下面的代码--

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


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

假设变量在
met1
中声明,则不需要
synchronized
假设变量在
met1
中声明,则不需要,如果变量是真正的方法局部变量,则不需要进行
synchronized

,但是,示例代码实际上并不显示局部声明!所以不要把这个例子到处传播…

如果变量是真正的方法局部的话就不要这样了——但是,您的示例代码实际上并没有显示局部声明!所以不要把这个例子到处传播…

不,如果一个方法只在局部范围内定义和使用变量,你不需要同步它。您只需要同步那些更改或提供对可变状态的访问的方法


Java并发规则比您想象的要复杂得多,而且有很多陷阱,因此非常值得一读。Goetz等人的“实践中的Java并发性”相当不错(基本上是马口铁说的)

否,如果方法仅在局部范围内定义和使用变量,则不需要对其进行同步。您只需要同步那些更改或提供对可变状态的访问的方法


Java并发规则比您想象的要复杂得多,而且有很多陷阱,因此非常值得一读。Goetz等人的“实践中的Java并发性”相当不错(基本上是马口铁说的)

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

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

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

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

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

在第二个示例中,local并不完全是局部变量,因为您没有在met1中声明它。也许你的意思是:

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

  }

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

在第二个示例中,局部变量不完全是局部的,因为您没有在met1中声明它。也许你的意思是:

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

  }
那么是的,您是正确的,因为每个方法调用都发生在调用线程的堆栈上,所以方法局部变量只存在于相应线程的堆栈中,不需要同步访问

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

  }