关于单例模式的理解(一)

对于大部分的小伙伴来说去面试的时候,总有几个公司会跳出来问你会设计模式吗?而我们大部分的回答都是单例模式,工厂模式,装饰器模式。。。。。。然后,再问你知道单例模式具体有几种写法?你会回答懒汉和饿汉,然后面试者叫你手写你就有可能蒙蔽了。
单例模式,顾名思义,单例就是只有一个,说明在创建的时候在全局状态下只需要创建一个即可,创建多个不仅开销大,而且很有可能不符合创建用意。
而我们说到的懒汉和饿汉模式,就是指在什么时候进行创建。懒汉模式,一般都是在第一次使用调用的时候进行创建,饿汉则是在类加载的时候就已经创建好了。大家可以看如下代码:

// 懒汉模式
public class SigletonExample1 {
    
    private SigletonExample1(){}
    
    private static SigletonExample1 instance = null;
    
    public SigletonExample1 getInstance(){
        if( instance == null ){
            instance = new SigletonExample1();
        }
        return instance;
    }
}

大家可以看到定义了静态私有的实例并且在第一次使用的时候,进行构造初始化,但是它并不是线程安全的,因为在多线程情况下完全有一定的几率是两个线程A和B同时使用,发现instance == null 于是都创建了实例,这样就有可能在实际的工程项目中造成重复计算或者其他的隐形问题。但是饿汉模式却是线程安全的,如下方代码所示:

// 饿汉模式
public class SigletonExample2 {

    private SigletonExample2(){}

    private static SigletonExample2 instance = new SigletonExample2();

    public SigletonExample2 getInstance(){
        return instance;
    }
}

但是我们并不提倡使用饿汉模式因为它会严重的影响性能,浪费空间。

那么,既然两种常见的写法都有或多或少的问题,那有没有更好的办法呢?一定是有的,请关注我的下一篇博客,我们将会一点点再修改原有的基础上进行改进。

你可能感兴趣的:(Effective,Java)