Singleton,Thread Safety和Mutex

时间:2015-10-22 03:42:35

标签: java multithreading

我今天在思考这个问题。这是我正在思考的一个场景。

使用方法

的Singleton类
public int addTwoNumbers(int a, int b) {
    int x = a;
    int y = b;
    int z = a + b;
    return z;
}

线程 - 1

singletonClassObj.addTwoNumbers(10,20);

线程 - 2

singletonClassObj.addTwoNumbers(100,200);

现在我的问题是什么,假设首先执行Thread-1并调用该方法。那么有可能在整个函数被线程-1执行之前,线程-2调用函数并改变x和y的值吗?例如,线程-1,将数据发送为10和20,在将求和分配给变量z之前,线程-2将x和y的值更改为100和200,这反过来使线程1返回300而不是为了解决这个问题,我们需要锁定或互斥,但这是可能的(没有互斥锁)。

2 个答案:

答案 0 :(得分:1)

addTwoNumbers :所有变量都是局部变量。调用此方法时,它们将存储在堆栈中。因为每个方法都创建自己的堆栈。所以这两个线程将拥有两个完全不同的堆栈。因此,从多线程角度来看,它们是安全的。您不需要任何锁或互斥锁。

如果您使用的是始终存储在堆内存区域中的任何对象(引用变量)。所以需要同步。

当您更新单例对象的状态时,您可能还需要同步。因为这是在线程之间共享的。

答案 1 :(得分:1)

不,两个或多个线程永远不可能访问方法中的相同本地变量。

请注意,当变量属于 reference 类型时(它们不在您的示例中,您只使用原语类型int),那么它们指向的对象可能同时被不同的线程访问。