Singleton类中的非静态成员

时间:2014-03-31 16:13:03

标签: java multithreading methods static singleton

我正在做一个单例类,如下所示。

public class SingletonTest {

    private static SingletonTest instance;

    private Integer result;

    private SingletonTest() {   
    }

    public synchronized static SingletonTest getInstance(){
        if(instance == null){
            instance = new SingletonTest();
        }
        return instance;
    }

    public Integer calculateResult(int value1, int value2) {
        result = value1 + value2;
        return result;
    }
}

但是当我从多个线程(使用JMeter)调用非静态成员时会出现问题。

以示例:

主题1: SingletonTest.getInstance()。calculateResult(1,2) - >返回3

主题2: SingletonTest.getInstance()。calculateResult(3,2) - >返回3

我认为这是因为2个线程在方法中同时访问并覆盖称为result的de属性。

3 个答案:

答案 0 :(得分:0)

你是对的,第二个线程正在访问第一个线程的结果集值。

如果要修改多个线程可见的值,则应同步该操作。

public synchronized Integer calculateResult(int value1, int value2) {
    result = value1 + value2;
    return result;
}

这样调用方法的第一个线程就会对单例进行锁定,第二个线程在完成之前无法访问它。

如果您打算使用并发性,尤其是official tutorials,您应该查看this

答案 1 :(得分:0)

您的猜测是正确的并且它正在发生,因为您的共享结果实例变量不是线程安全的。 不知道你为什么要分享它。修复代码在这里:

public class SingletonTest {

    private static SingletonTest instance;

    private SingletonTest() {   
    }

    public synchronized static SingletonTest getInstance(){
        if(instance == null){
            instance = new SingletonTest();
        }
        return instance;
    }

    public Integer calculateResult(int value1, int value2) {
        Integer result = value1 + value2;
        return result;
    }
}

答案 2 :(得分:-2)

试试这个

public class Singleton {

    private static Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
         return instance;
    }
}