美文网首页
实现单例模式需要考量的几个点

实现单例模式需要考量的几个点

作者: 鸿雁长飞鱼龙潜跃 | 来源:发表于2019-09-30 14:08 被阅读0次

单例模式是一个老生常谈的话题了,如何实现呢?我们这里不再赘述,我们这里梳理一下思路,看看设计一个单例模式需要考虑的问题。

1,延迟加载

new操作放在方法内部,不要作为类的静态成员变量暴露给调用者。

2,只实例化一次

实例化之前先判断是否为null。

3,线程安全

有多种思路:synchronized关键字,内部类等。

synchronized关键字其实就是加锁,这是jvm给我们提供的一种线程安全机制。

内部类是使用到了jvm类加载机制,jvm能够保证一个类在加载的时候是线程安全的。

4,规避反射调用

反射机制增强了java的动态性,但是也会带来一些问题。比如我们这里要讨论的,反射机制破坏了单例模式,为什么呢?因为反射机制可以绕过java类的访问权限,调用java类的私有构造方法,生成类对象。

兵来将挡水来土掩。要解决这个问题,我们最常用的方式是拋异常。

好了,只要掌握了这几个要点,然后结合自己的业务场景,相信你也可以写出自己的单例类了。


下面我们看一个实例:Logger实例。

我们在实际开发中,打印日志都会这样来写:

private static final Logger logger = LoggerFactory.getLogger(Xxx.class);

Slf4j日志框架在生成logger实例时,使用了单例模式,当然,还有其他设计模式,比如工厂模式和门面模式等。

我们看一下源码,源码在LoggerFactory.class中,最终调用方法getLoggerFactory(),该方法源码如下:

public static ILoggerFactory getILoggerFactory(){

    if (INITIALIZATION_STATE == 0){

        Class var0 = LoggerFactory.class;

        synchronized(LoggerFactory.class){

            if (INITIALIZATION_STATE == 0){

                INITIALIZATION_STATE == 1;

                performInitialization();

            }

        }

    }

}


performInitialization()方法最终会调用StaticLoggerBinder.getSingleton(),该方法源码如下:

// Logger实例没有延迟加载,而是初始化StaticLoggerBinder的时候就加载了

private static StaticLoggerBinder SINGLETON = new StaticLoggerBinder();3

public static StaticLoggerBinder getSingleton(){

    return SINGLETON;

}

相关文章

  • 实现单例模式需要考量的几个点

    单例模式是一个老生常谈的话题了,如何实现呢?我们这里不再赘述,我们这里梳理一下思路,看看设计一个单例模式需要考虑的...

  • 学而时习之单例模式

    本文主要说明单例模式的概念,应用,以及C++实现。 I、上帝视角看单例模式 1.1 单例模式特点 单例模式需要满足...

  • 单例模式

    单例模式 当系统中对于某个类,只需要有一个实例化对象时,可以使用单例模式。 单例模式实现方式 单例模式的实现主要有...

  • 单例模式(单例宏)

    单例模式 单例模式(arc) 类的实现 调用单例 单例模式(mrc) 除了上边的方法我们在mrc的时候还需要增加一...

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • 单例模式

    一、实现单例模式 或者 二、透明的单例模式 三、用代理实现单例模式 四、JavaScript中的单例模式 在Jav...

  • python面试题-2018.1.30

    问题:如何实现单例模式? 通过new方法来实现单例模式。 变体: 通过装饰器来实现单例模式 通过元类来创建单例模式...

  • 单例模式之枚举类enum

    通过枚举实现单例模式 枚举类实现单例模式的优点 对于饿汉式单例模式和懒汉式单例模式了解的同学,使用以上两种单例模式...

  • 单例模式

    单例模式及C++实现代码单例模式4种实现详解 c++11改进我们的模式之改进单例模式 单例模式(Singleton...

  • 单例模式和GCD单例实现

    1、传统单例模式2、GCD单例模式3、用宏实现GCD单例模式4、用宏实现GCD单例模式,名称随类名变化而变化 单例...

网友评论

      本文标题:实现单例模式需要考量的几个点

      本文链接:https://www.haomeiwen.com/subject/guocpctx.html