代碼以下: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次,兩個單例模式都是隻運行了一次構造函數。測試