JAVA设计模式之单例模式

嘉乐集团总公司 8月前 ⋅ 226 阅读

什么是单例模式

	单例:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
	单例模式是一种常用的软件设计模式之一,其目的是保证整个应用中只存在类的唯一个实例。
	比如我们在系统启动时,需要加载一些公共的配置信息,对整个应用程序的整个生命周期中都可见且唯一,这时需要设计成单例模式。如:spring容器,session工厂,缓存,数据库连接池等等。

timg.jpg 饿汉式

public class Singleton {
    private static final Singleton instance = new Singleton();
    private Singleton(){}
    private static Singleton getInstance(){
        return instance;
    }
}

饿汉模式是最简单的一种实现方式,饿汉模式在类加载的时候创建一次实例,不会存在多个线程创建多个实例的情况,避免了多线程同步的问题。它的缺点也很明显,即使这个单例没有用到也会被创建,而且在类加载之后就被创建,内存就被浪费了。

懒汉式

public class Singleton {
    private static final Singleton instance = null;
    private Singleton(){}
    public static Singleton newInstance(){
        if (null == instance) {
            instance = new Singleton();
        }
        return instance;
    }
}

如果某个单例使用的次数少,并且创建单例消耗的资源较多,那么就需要实现单例的按需创建,这个时候使用懒汉模式就是一个不错的选择。但是这里的懒汉模式并没有考虑线程安全问题,在多个线程可能会并发调用它的getInstance()方法,导致创建多个实例,因此需要加锁解决线程同步问题

同步锁

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

** 加锁的懒汉模式看起来即解决了线程并发问题,又实现了延迟加载,然而它存在着性能问题,依然不够完美。synchronized修饰的同步方法比一般方法要慢很多,如果多次调用getInstance(),累积的性能损耗就比较大了。因此就有了双重校验锁**

4、双重校验锁

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

静态内部类

public class Singleton{
    private static class SingletonHolder{
        public static Singleton instance = new Singleton();
    }
    private Singleton(){}
    public static Singleton newInstance(){
        return SingletonHolder.instance;
    }
}

枚举

public enum Singleton{
    instance;
    public void whateverMethod(){}    
}

全部评论: 0

    我有话说:

    十堰嘉乐软件基地

    微信 扫一扫

    客户服务热线

    0719-400-10010

    在线客服
    支付宝打赏 微信打赏