这个单例类会导致多线程问题吗?

时间:2018-10-09 19:16:45

标签: java design-patterns

以下单例类代码是否会在多线程环境中引起任何问题?

public class mySingletonClass{  

    private static mySingletonClass INSTANCE = new mySingletonClass();      

    private mySingletonClass() 
    {       
        super();    
    }   

    public static mySingletonClass getInstance() 
    {       
        return INSTANCE;    
    }
}

2 个答案:

答案 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突变。