单例模式

一、单例模式核心作用:

  • 保证一个类只有一个实例,并提供一个访问该实例的全局访问点。

 

二、常见的五种单例模式实现方法

- 主要

  • 懒汉式:(线程安全,调用效率高,不能延时加载)
  • 饿汉式:(线程安全,调用效率不高,可以延时加载)

- 其他

  • 双重检测锁:(由于JVM底层内部模型原因,偶尔会出问题,不建议使用)
  • 静态内部类:(线程安全,调用效率高,可以延时加载)
  • 枚举单例:(线程安全,调用效率高,不能延时加载)
/**
 * 饿汉式
 */
public class SingletonDemo01 {
    //1.私有构造器
    private SingletonDemo01(){
    }

    //2. 提供静态属性,直接new对象
    private static SingletonDemo01 instance = new SingletonDemo01(); //类初始化时,立即加载,所以叫饿汉式。
                                                                    // 但是如果不使用这个对象,则白白加载了,浪费资源,所以最好能延时加载。
    //3. 提供一个公开访问的方法
    public static SingletonDemo01 getInstance(){
        return instance;
    }   //这里不需要使用“Synchronized”, 因为类初始化的时候对象被创建,加载类的时候线程是必然安全的。
}       //由于方法没有同步,调用效率高!

 

/**
 * 懒汉式
 */
public class SingletonDemo01 {
    //1.私有构造器
    private SingletonDemo01(){
    }

    //2. 类初始化时,不初始化对象,等到方法被调用的时候才创建(延时加载)
    private static SingletonDemo01 instance;

    //3. 提供一个公开访问的方法
    public static synchronized SingletonDemo01 getInstance(){
        if (instance == null){
            instance = new SingletonDemo01();
        }
        return instance;
    }   //这里必须使用“Synchronized”! 因为对象在方法被调用的时候才创建,如果不小心被多个线程同时调用,则出现多个对象,所以要加锁。
}       //由于方法同步,调用效率低!
/**
 * 双重检测锁模式
* 调用效率高,也可以延时加载。但是由于JVM底层设计的问题,偶尔会数据出错,不建议使用。 * 基本思想是把同步放到if内部,提高执行效率,这样不用每次获取对象的时候都同步,只有第一次的时候需要同步。
*/
/**
 * 静态内部类实现
 */
public class SingletonDemo01 {
    //1、私有化构造器
    private SingletonDemo01(){
    }
    
    //2、构造静态内部类,New对象
    private static class SingletonClassInstance{
        private static final SingletonDemo01 instance = new SingletonDemo01();
    }
    
    //3、构造公共访问方法。只有调用这个方法的时候,才会加载到这个内部类,所以实现了延时加载
    //同时由于加载类是天然的线程安全,所以在加载内部类的时候也一样,实现了线程安全
    //只有在调用这个方法的时候才加载,所以调用效率也不错
    public static SingletonDemo01 getInstance(){
        return SingletonClassInstance.instance;
    }
}
/**
 * 枚举实现单例
 * 枚举本身就是单例,所以实现比较简单。但不能延时加载。
 */
public enum SingletonDemo01 {
    /**
     * 定义一个枚举元素,他就代表了Singleton的一个实例。
     */
    INSTANCE;
    /**
     * 单例可以有自己的操作 
     */
    
    public void singletonOperation(){
        //功能处理
    }
}

 

posted on 2018-12-03 15:33  TheExile  阅读(103)  评论(0)    收藏  举报

导航