我正在做一个单例类,如下所示。
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属性。
答案 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;
}
}