Java SE-最全的單例模式詳解
阿新 • • 發佈:2019-02-08
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)); } }