1. 程式人生 > >Java SE-最全的單例模式詳解

Java SE-最全的單例模式詳解

package org.stevejrong.test;

import org.stevejrong.singleton.DualCheckLockSingleton;
import org.stevejrong.singleton.EagerSingleton;
import org.stevejrong.singleton.EnumSingleton;
import org.stevejrong.singleton.LazyInitHolderSingleton;
import org.stevejrong.singleton.LazySingleton;

public class Test {
	static long startTime;

	public static void main(String[] args) {
		System.out
				.println("---------------------------------餓漢模式測試----------------------------------");
		startTime = System.nanoTime();
		EagerSingleton eagerSingleton1 = EagerSingleton.getInstance();
		System.out.println("第一次例項化" + eagerSingleton1.getClass().getName()
				+ "類的例項 HashCode:" + eagerSingleton1.getClass().hashCode());

		EagerSingleton eagerSingleton2 = EagerSingleton.getInstance();
		System.out.println("第二次例項化" + eagerSingleton2.getClass().getName()
				+ "類的例項 HashCode:" + eagerSingleton2.getClass().hashCode());
		System.out.println("用時:" + (System.nanoTime() - startTime));

		System.out
				.println("---------------------------------懶漢模式測試----------------------------------");
		startTime = System.nanoTime();
		LazySingleton lazySingleton1 = LazySingleton.getInstance();
		System.out.println("第一次例項化" + lazySingleton1.getClass().getName()
				+ "類的例項 HashCode:" + lazySingleton1.getClass().hashCode());

		LazySingleton lazySingleton2 = LazySingleton.getInstance();
		System.out.println("第二次例項化" + lazySingleton2.getClass().getName()
				+ "類的例項 HashCode:" + lazySingleton2.getClass().hashCode());
		System.out.println("用時:" + (System.nanoTime() - startTime));

		System.out
				.println("---------------------------------雙重檢查加鎖模式測試----------------------------------");
		startTime = System.nanoTime();
		DualCheckLockSingleton dualCheckLockSingleton1 = DualCheckLockSingleton
				.getInstance();
		System.out.println("第一次例項化"
				+ dualCheckLockSingleton1.getClass().getName()
				+ "類的例項 HashCode:"
				+ dualCheckLockSingleton1.getClass().hashCode());

		DualCheckLockSingleton dualCheckLockSingleton2 = DualCheckLockSingleton
				.getInstance();
		System.out.println("第二次例項化"
				+ dualCheckLockSingleton2.getClass().getName()
				+ "類的例項 HashCode:"
				+ dualCheckLockSingleton2.getClass().hashCode());
		System.out.println("用時:" + (System.nanoTime() - startTime));

		System.out
				.println("---------------------------------懶載入模式測試----------------------------------");
		startTime = System.nanoTime();
		LazyInitHolderSingleton lazyInitHolderSingleton1 = LazyInitHolderSingleton
				.getInstance();
		System.out.println("第一次例項化"
				+ lazyInitHolderSingleton1.getClass().getName()
				+ "類的例項 HashCode:"
				+ lazyInitHolderSingleton1.getClass().hashCode());

		LazyInitHolderSingleton lazyInitHolderSingleton2 = LazyInitHolderSingleton
				.getInstance();
		System.out.println("第二次例項化"
				+ lazyInitHolderSingleton2.getClass().getName()
				+ "類的例項 HashCode:"
				+ lazyInitHolderSingleton2.getClass().hashCode());
		System.out.println("用時:" + (System.nanoTime() - startTime));

		System.out
				.println("---------------------------------單例列舉模式測試----------------------------------");
		startTime = System.nanoTime();
		System.out.println("第一次例項化列舉例項 HashCode:"
				+ EnumSingleton.singleInstance.getClass().hashCode());
		System.out.println("第二次例項化列舉例項 HashCode:"
				+ EnumSingleton.singleInstance.getClass().hashCode());
		System.out.println("用時:" + (System.nanoTime() - startTime));

	}
}