JavaSE经典面试题--------------------------写一个单例(Singleton)的示例

版权声明:本文为changeyd原创文章,未经changeyd允许不得转载。谢谢合作 https://blog.csdn.net/qq_40223688/article/details/87920290

Singleton:单例设计模式,那么什么是单例设计模式呢?

单例模式,是一种常用的软件设计模式。在他的核心结构中只包含一个称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类只有一个实例。一句话概括:就是一个类只能有一个对象实例。

那么理解了概念,那么我们就好编程了,首先我们就先考虑如何保证怎么编码让该对象只能有一个实例了?

怎么创造实例?

通过构造方法来创建实例,那么说,我们只有将构造方法隐藏起来,封装起来,那么将可以由开发人员控制构造权了。

那么我们在其类内部声明一个静态成员变量,和提供一个静态方法来对外开发该对象的获取,这样就可以形成一个单例示例了。

如下图:

但是,上图还未写完,因为基础好点的人一看就知道,这样获取到的对象一定为Null,并没有具体实例化:

那么,如果进行实例化操作呢?这里又可以引出两个设计模式概念:懒汉式模式,饿汉式模式

顾名思义,来说说什么是懒汉式和饿汉式:

懒汉式:当你要用该对象的时候,我再构造实例化。

饿汉式:我管你要不要用该对象,我饿急了,我先实例化了再说。

两种方式的区别:懒汉式为延迟创建对象(属于一种延迟加载设计思想),饿汉式为直接创建对象,不存在线程安全问题。所以这说明懒汉式在多线程应用中存在线程安全问题,适用于单线程。

那么接下来我将贴出各种模式实例化方式:

懒汉式:

饿汉式:

第二种:通过静态代码块实例化的饿汉式

那么说懒汉式模式存在线程不安全,如何保证线程安全的懒汉式模式呢:关键字:synchronized,上锁,但是其执行效率将大大降低。

那么你肯定会问:这好几种设计单例模式的示例,我到底该用哪种?

用接下来这种:DCL双检查锁机制(DCL:double checked locking)

此种方式使用两次判断singletonFactory对象是否为空,保证了对象在线程首次争夺资源的时候才进行线程锁机制,之后当singletonFactory不为null时就不会进入线程锁程序块中。

内部类实现懒汉式模式

在内部类被加载和初始化,才创建SingletonFactory实例对象
静态内部类不会自动随着外部类的加载和初始化而初始化,它是要单独去加载和初始化的。
因为是在内部类加载和初始化时,创建的,因此线程安全的。相较DCL双检查锁机制更为精简,其线程也是安全的。

猜你喜欢

转载自blog.csdn.net/qq_40223688/article/details/87920290