网上很多人说,使用双重检验锁方法实现单例模式可能会new多个实例,而内部类方法和枚举类方法完美解决了这个问题
因为Android很少使用枚举,本次只研究双重检验锁方法和内部类方法
双重检验锁方法:
代码如下:
public class SingletonB {
private static volatile SingletonB mInstance;
private SingletonB() {
System.out.println("双重检验锁方法单例模式");
}
public static SingletonB getInstance() {
if (mInstance == null) {
synchronized (SingletonB.class) {
if (mInstance == null) {
mInstance = new SingletonB();
}
}
}
return mInstance;
}
}
内部类方法:
代码如下:
public class SingletonA {
private SingletonA() {
System.out.println("内部类方法单例模式");
}
private static class Singleton {
private static final SingletonA INSTANCE = new SingletonA();
}
public static SingletonA getInstance() {
return Singleton.INSTANCE;
}
}
在多线程环境下分别使用这两种单例模式
测试代码:
public class Test {
public static void main(String[] args) {
Thread[] threads = new Thread[10000];
for (int i = 0; i < threads.length; i++) {
threads[i] = new Thread() {
public void run() {
SingletonA.getInstance();
SingletonB.getInstance();
};
};
}
for (int i = 0; i < threads.length; i++) {
threads[i].start();
}
}
}
运行结果
运行了N次,两个单例模式都是只运行了一次构造函数。