常见设计模式: 单例模式

单例模式Singleton

单例模式是设计模式最简单基础的模式之一, 下面介绍几种常见的单例模式的实现方式.

懒汉

这种单例模式用于单线程程序设计, 当程序设计需要应用并发时,
这种实现无法保证单例类只会被实例化一次.

public class BasicSingleton {
    public static Singleton instance;

    private BasicSingleton(){}

    public static Singleton getInstance(){
        if (instance == null)
            instance = new Singleton();
        return instance;
    }
}

懒汉 + 同步区

通过简单的同步去加锁, 就做到了线程安全, 适用于性能要求不高的场景.

public class BasicSingleton {
    public static Singleton instance;

    private BasicSingleton() {}

    public static synchronized Singleton getInstance() {
        if (instance == null)
            instance = new Singleton();
        return instance;
    }
}

饿汉

利用Java类的加载机制, 在加载类期间初始化一个实例, 但是
这种实现不具备懒惰实例(lazy)的特性

public class EagerSingleton{
    public static EagerSingleton instance = new EagerSingleton();

    public static getInstance(){
        return instance;
    }
}

双重检查加锁 Double-Check-Lock

只在第一次实例化期间进行同步区加锁, 既保证了性能, 又确保线程安全.
需要valatile关键字支持

public class Singleton {
    public static volatile Singleton instance;

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

枚举

利用枚举的特性可以实现线程安全的单例, 枚举的每个元素就是一个实例, 且每次访问的都是同一个实例.同时可以避免反序列化实例出多个对象. 但不具备延迟加载的特性了.

这种方式代码最简单, 这也是Effective Java中推荐的方式.

public enum EnumSingleton{
    SINGLETON;

    private int fields;

    private void foo(){};
}
posted @ 2017-04-27 09:26  Yusuzhan  阅读(153)  评论(0编辑  收藏  举报
Fork me on GitHub