工厂模式 - 单例模式

1、 单例模式

1.1、什么是单例模式

  单例模式确保某一个类只有一个实例。而且自行实例化并向整个系统提供这个实例。这个类成为单例类。Java中,通常单例模式的构造方法是私有的,类只有一个唯一实例,类自己创建自己的实例,所有其他对象都使用这个唯一的实例。

1.2、饿汉式

       饿汉式在类被加载时,static变量会被初始化。由虚拟机保证只会装载一次该类,所以是天然的线程安全的。

/**
 * 饿汉式单例
 */
public class HungerSingleton {
    /**
     * 利用JVM的static机制保障唯一性,同时也保证了线程安全问题
     */
    private static final HungerSingleton instance = new HungerSingleton();

    private HungerSingleton(){}

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

  

1.3、懒汉式

      懒汉式的初始化动作被延迟到了方法调用。在类加载的时候,实例对象为null。在真正使用的时候调用getInstance()去初始化,延迟加载。利用synchronized保证线程安全。

/**
 * 懒汉式
 */
public class LazySingleton {

    private static LazySingleton instance= null;

    private LazySingleton(){}

    /**
     * 利用synchronized关键字,对方法加锁,由于是静态方法,所有锁的是LazySingleton的类对象
     */
    synchronized public static LazySingleton getInstance(){
        if(instance == null){
            instance = new LazySingleton();
        }
        return instance;
    }
}

1.4、静态内部类 

       利用jvm确保唯一性和线程安全问题,内部类在getInstance()才会被加载并初始化内部类的instance静态变量,延迟加载。

/**
 * 静态内部类单例
 */
public class StaticInnerSingleton {

    private StaticInnerSingleton(){}

    /**
     * 静态内部类,利用jvm确保唯一性和线程安全问题
     */
    private static class SingletonInstance {
        private static final StaticInnerSingleton instance = new StaticInnerSingleton();
    }

    public static StaticInnerSingleton getInstance() {
        return SingletonInstance.instance;
    }
}

1.5、枚举 

       最简单的单例,由JVM唯一性,并且天生的线程安全。

/**
 * 枚举单例
 */
public enum EnumSingleton {
    /**
     *  定义一个枚举的元素,它就代表了Singleton 的一个实例。
     */
    INSTANCE;
}

  获取单例对象也很简单,只需要 EnumSingleton singleton = EnumSingleton.INSTANCE;


1.6、小结
 

       四种单例。按延迟加载划分。非延迟加载的为:饿汉式和枚举。延迟加载的为:静态内部类和懒汉式。

       如果有延迟加载的要求,静态内部类会比懒汉式好很多,毕竟懒汉式的同步锁摆在那。如果没有延迟加载的要求,饿汉式和枚举都行。

参考:

《Java与模式》

ps:书上没有静态内部类和枚举类的单例。这是以前学习就知道的单例手段。

猜你喜欢

转载自www.cnblogs.com/simple-ly/p/9813765.html