我对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正在修改一个局部变量,我认为这对于执行该方法的每个线程都是唯一的。所以在这种情况下,当一个线程只修改一个局部变量时,是否有必要使该方法同步?
答案 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;
}
然后是的,你是对的,因为每个方法调用都发生在调用线程的堆栈上,方法局部变量只存在相应的线程堆栈而不需要同步访问。