以下单例类代码是否会在多线程环境中引起任何问题?
public class mySingletonClass{
private static mySingletonClass INSTANCE = new mySingletonClass();
private mySingletonClass()
{
super();
}
public static mySingletonClass getInstance()
{
return INSTANCE;
}
}
答案 0 :(得分:2)
上面的代码在多线程环境中不会引起任何问题,因为在类加载期间将创建INSTANCE,并且只会执行一次。
每次调用getInstance(),即使它是并发的,也不会引起任何问题。
答案 1 :(得分:0)
此类是线程安全的,主要原因是此类中没有可在多个线程之间共享的资源。 例如实例变量。
该类为单例,因为当通过第一次调用mySingletonClass.getInstance()
加载该类时,JVM只会为该类创建单个对象。
现在,每次调用此方法same instance
时都将返回。但现在考虑以下情形:
public class mySingletonClass{
int x;
public vois setX(int x){
this.x = x;
}
public int getX(){
return x;
}
private static mySingletonClass INSTANCE = new mySingletonClass();
private mySingletonClass()
{
super();
}
public static mySingletonClass getInstance()
{
return INSTANCE;
}
}
现在有一个instance variable x
。现在,由于此类是单例类,因此同一对象将在多个线程之间共享,这意味着同一实例变量x
。现在,您不能确定不同的线程是否在访问x
的正确值。然后,您必须使用不同的方式,以便一次只有一个线程访问共享资源,在上述情况下为x
。为此,您可以使用setX(int x) and getX()
方法synchronized
或可以创建对象LOCK
,该对象将确保一次只有一个线程将变量x
突变。