设计模式:单例模式

自作多情 提交于 2020-02-10 01:11:08

单例模式就是采取一定方法保证在整个软件系统中,对于某个类只能存在一个对象的实例,并且该类只提供一个取得其对象实例的方法。属于创建型。

优点

  • 在内存里只有一个实例,减少了内存开销
  • 可以避免对资源的多重占用
  • 设置全局访问点,严格控制访问

单例的实现

懒汉式

/**
 * 懒汉式单例模式
 * (在多线程下不能保证创建的实例是唯一的)
 */
public class LazySingleton {

    private LazySingleton(){}

    //和饿汉式不同,这里不实例化,而是在需要的时候再去new
    private static LazySingleton instance;

    //在多线程下不能保证创建的实例是唯一的
    public static LazySingleton getInstance(){
        if(instance==null){
            instance = new LazySingleton();
        }
        return instance;
    }
}

懒汉式改进(线程安全)

/**
 * 懒汉式改进 线程安全的单例模式
 */
public class SynchronizedSingleton {

    private SynchronizedSingleton(){}

    //和饿汉式不同,这里不实例化,而是在需要的时候再去new
    private static volatile SynchronizedSingleton instance;

    //双重加锁
    public static SynchronizedSingleton getInstance(){
        if(instance == null){
            synchronized (SynchronizedSingleton.class){
                if(instance == null){
                    instance = new SynchronizedSingleton();
                }
            }
        }
        return instance;
    }
}

使用synchronized保证创建单例对象时的线程安全,使用volatile修饰instance,防止在执行instance = new SynchronizedSingleton()时候发生指令重排序带来线程安全问题。

静态内部类

大专栏  设计模式:单例模式ss="line-numbers language-java">
public class InnerClassSingleton {

    public static InnerClassSingleton getInstance(){
        return Singleton.singleton;
    }

    private static class Singleton{
        private static InnerClassSingleton singleton = new InnerClassSingleton();
    }

    private InnerClassSingleton(){}

}

饿汉式

/**
 * 饿汉式单例模式
 */
public class HungrySingleton {

    //将构造函数私有化,不允许外部对象直接调用
    private HungrySingleton(){}

    private static final HungrySingleton instance = new HungrySingleton();

    //对外提供唯一用于获取实例的方法
    public static HungrySingleton getInstance(){
        return instance;
    }

}

枚举实现单例

    public enum EnumSingleton {
        INSTANCE;
     }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!