我们在创建单例模式时经常使用的是静态内部类的方式,也是普遍推荐的使用方式,代码示例如下:
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
因此可以看出, 单例模式是针对应用而言的, 在整个系统中是可以存在多个实例的。