关于双重检验锁方法和内部类方法实现单例模式的实验

网上很多人说,使用双重检验锁方法实现单例模式可能会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次,两个单例模式都是只运行了一次构造函数。

其实我的期望是能出现双重锁方法的bad case,但是并没有出现。本次实验失败,下次再接再厉。

posted @ 2018-05-30 23:37  沈子羽  阅读(648)  评论(0编辑  收藏  举报