天天看点

单例模式真的只有一个实例吗

我们在创建单例模式时经常使用的是静态内部类的方式,也是普遍推荐的使用方式,代码示例如下:

public class SingleTon {
    private SingleTon(){}

    private static class SingleTonHolder {
        private final static SingleTon instance = new SingleTon();
    }

    public static SingleTon getInstance() {
        return SingleTonHolder.instance;
    }
}
           

相信大家对这个单例模式都不陌生,它既保证了线程安全,又能够延迟实例化(即调用getInstance()方法时才实例化)。

这种方式简单、有效,保证了只有一个实例。但是,在项目中发现,“只有一个实例”这种说法其实是有隐含条件的,即前提条件是在某一个应用中调用getInstance()方法,instance才是被实例化一次,那么多个应用都有调用getInstance()方法,instance也是只被实例化一次吗?答案是否定的。

经测试发现,不同的应用在调用getInstance()方法时,instance会被实例化多次,即若有3个应用调用了getInstance()方法,那么instance将会被实例化3次。我在构造器中分别打印了调用者的name和id,具体如下:

    应用A:name =ExecutorThread#1, id = 161

    应用B:name =AsyncTask #4, id = 86

    应用C:name =Binder:3788_6, id = 178

因此可以看出, 单例模式是针对应用而言的, 在整个系统中是可以存在多个实例的。

继续阅读