singleton - 四种实现懒汉式单例的方式

69 阅读1分钟

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一种不断追求完美的过程。

public class Single {

    public static void main(String[] args) {
        System.out.println(Single1.getInstance());
        System.out.println(Single2.getInstance());
        System.out.println(Single3.getInstance());
        System.out.println(Single4.getInstance());
    }

    /**
     * 静态内部类实现
     */
    static class Single1 {
        private Single1() {};
        public static Single1 getInstance() {
            return Sin.SINGLE;
        }
        private static class Sin {
            private static final Single1 SINGLE = new Single1();
        }
    }

    /**
     * 双检锁实现
     */
    static class Single2 {
        private Single2() {}
        private static Single2 SINGLE;
        public static Single2 getInstance() {
            if (null == SINGLE) {
                synchronized (Single2.class) {
                    if (null == SINGLE) {
                        SINGLE = new Single2();
                    }
                }
            }
            return SINGLE;
        }
    }

    /**
     * 线程安全的实现
     */
    static class Single3 {
        private Single3() {}
        private static Single3 SINGLE;
        public synchronized static Single3 getInstance() {
            if (null == SINGLE) {
                SINGLE = new Single3();
            }
            return SINGLE;
        }
    }

    /**
     * 线程不安全的实现
     */
    static class Single4 {
        private Single4() {}
        private static Single4 SINGLE;
        public static Single4 getInstance() {
            if (null == SINGLE) {
                SINGLE = new Single4();
            }
            return SINGLE;
        }
    }
}