我今天在思考这个问题。这是我正在思考的一个场景。
public int addTwoNumbers(int a, int b) {
int x = a;
int y = b;
int z = a + b;
return z;
}
singletonClassObj.addTwoNumbers(10,20);
singletonClassObj.addTwoNumbers(100,200);
现在我的问题是什么,假设首先执行Thread-1并调用该方法。那么有可能在整个函数被线程-1执行之前,线程-2调用函数并改变x和y的值吗?例如,线程-1,将数据发送为10和20,在将求和分配给变量z之前,线程-2将x和y的值更改为100和200,这反过来使线程1返回300而不是为了解决这个问题,我们需要锁定或互斥,但这是可能的(没有互斥锁)。
答案 0 :(得分:1)
addTwoNumbers
:所有变量都是局部变量。调用此方法时,它们将存储在堆栈中。因为每个方法都创建自己的堆栈。所以这两个线程将拥有两个完全不同的堆栈。因此,从多线程角度来看,它们是安全的。您不需要任何锁或互斥锁。
如果您使用的是始终存储在堆内存区域中的任何对象(引用变量)。所以需要同步。
当您更新单例对象的状态时,您可能还需要同步。因为这是在线程之间共享的。
答案 1 :(得分:1)
不,两个或多个线程永远不可能访问方法中的相同本地变量。
请注意,当变量属于 reference 类型时(它们不在您的示例中,您只使用原语类型int
),那么它们指向的对象可能同时被不同的线程访问。