程序员

单例模式简介

2018-09-08  本文已影响25人  eb6684925911

本文介绍了单例模式并附有java代码实现demo。内容仅供参考使用,有不足之处请及时指出,也欢迎大家交流探讨。

单例模式

单例模式是创建型模式的一种,其保证了单例类只有一个实例对象。

单例模式特性

单例模式实现方式有多种,但其遵循以下3个特性。

懒汉式

public class SingletonDemo {

    private static SingletonDemo instance;

    private SingletonDemo() {

    }

    public static synchronized SingletonDemo getInstance() {

        if (null == instance) {
            instance = new SingletonDemo();
        }
        return instance;
    }
}

时间换空间,懒加载,用synchronized修饰保证了多线程安全,但也降低了效率。

饿汉式

public class SingletonDemo {

    private static SingletonDemo instance = new SingletonDemo();

    private SingletonDemo() {

    }

    public static SingletonDemo getInstance() {
        return instance;
    }
}

空间换时间,非懒加载,通过类加载机制保证了线程安全,没有使用synchronized,效率相对比要高一些。

双重检查加锁(DCL:Double-checked Locking)

public class SingletonDemo {

    private volatile static SingletonDemo instance;

    private SingletonDemo() {

    }

    public static SingletonDemo getInstance() {

        if (null == instance) {

            synchronized (SingletonDemo.class) {
                if (null == instance) {
                    // 因为该操作非原子性,需用volatile修饰
                    instance = new SingletonDemo();
                }
            }
        }
        return instance;
    }
}

时间换空间,懒加载,将synchronized由getInstance具体到对应的构建单例操作上,即保证了多线程安全,想对比懒汉式也提高了效率。

静态内部类

public class SingletonDemo {

    private static class SingletonDemoHolder {
        private static final SingletonDemo instance = new SingletonDemo();
    }

    private SingletonDemo() {

    }

    public static final SingletonDemo getInstance() {
        return SingletonDemoHolder.instance;
    }
}

时间换空间,懒加载,通过引入静态内部类,避免了SingletonDemo的加载导致instance的初始化,实现了懒加载,而且性能上相对比双重检查加锁有所提高。

上一篇 下一篇

猜你喜欢

热点阅读