Java 单例设计模式

简介

单例设计模式如其名,在系统中只存在一个实例,自行实例化供系统使用。(百度百科)每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情况。

饿汉式单例模式

饿汉式就是利用关键字 static 的特性。在类加载初始化时,就创建好对象供外部使用,如果系统不重启的情况下,这个对象在系统中始终是唯一的。

/**
 * 饿汉式单例模式
 */
public class EagerSingleton {
    /**
     * 类加载时创建对象,线程安全,但是类加载时就会初始化实例,占用空间较大
     */
    private static final EagerSingleton instance = new EagerSingleton();

    /**
     * 私有化构造函数
     */
    private EagerSingleton(){}

    /**
     * 获取单例实例
     * @return 单例实例
     */
    public EagerSingleton getInstance() {
        return this.instance;
    }
}

总结

饿汉式的优点是线程安全,因为类只会被加载一次,在类加载时就创建了对象。缺点是无论是否使用,在类加载时都会创建对象,所以占用的内存空间比较大。

懒汉式单例模式

懒汉式顾名思义,就是在需要的时候,再创建实例。


/**
 * 懒汉单例模式
 */
public class LazySingleTon {
    private static LazySingleTon instance;

    /**
     * 私有化构造函数
     */
    private LazySingleTon() {

    }

    /**
     * 获取单例实例
     * @return 单例实例
     */
    public LazySingleTon getInstance() {
        if (instance == null) {
            this.instance = new LazySingleTon();
        }
        return instance;
    }
}

总结

懒汉式的优点是在需要时对象才会被创建,不会在未使用时占用内存空间,缺点是在多线程的系统下还是可能会被创建多个对象。

双检锁懒汉式单例模式

通过双重检查以及同步代码块创建的的饿汉式单例模式,保证在多线程系统中实例不会被多次创建

/**
 * 双检锁懒汉单例模式
 */
public class LazySyncSingleton {
    /**
     * volatile 用于禁止多线程中重排序,使读(read)操作发生在写(write)之后
     */
    private volatile static LazySyncSingleton instance;

    /**
     * 私有构造函数
     */
    private LazySyncSingleton(){};

    /**
     * 获取去单例实例
     * @return 单例实例
     */
    public LazySyncSingleton getInstance() {
        if (instance == null) {
            synchronized (LazySyncSingleton.class) {
                if (instance == null) {
                    instance = new LazySyncSingleton();
                }
            }
        }
        return instance;
    }
}

总结

通过同步代码块以及双重检查保证多线程系统下实例的唯一性,但是需要注意重排序的问题,所以在定义需要加上 volatile 关键字禁止重排序。

你可能感兴趣的:(Java设计模式,java,设计模式)