8道常考Java单例模式面试题
2023-03-23 15:15:00
Java单例设计模式是GoF23的设计模式之一,也是最常用的设计模式之一,所以想参与java程序员工作面试的朋友必须提前学习
java单例模式面试的内容,java单例模式几乎总是出现在初级、中级和高级面试中,所以它仍然非常重要。
1、什么是java单例模式?
答:单例模式是一种常用的软件设计模式,其定义是单例对象类只能允许一个例子存在。很多时候,整个系统只需要有一个全局对象,这有利于我们协调整个系统的行为。例如,在服务器程序中,服务器的配置信息存储在文件中,由单个对象读取,然后服务过程中的其他对象通过单个对象获取这些配置信息。这种方法简化了复杂环境下的配置管理。
2、实现单例的步骤?
答:单例实现主要有以下两个步骤:(
1)将此类结构方法定义为私有方法,使其他代码不能通过调用此类结构方法来实例对象,只能通过该类提供的静态方法获得该类的唯一实例;(2)在此类中提供静态方法。当我们调用此方法时,如果该类持有的引用不是空的,则返回此引用,若类保持引用为空,则创建此类实例,并将实例引用给该类保持引用。3、单例模式的适用场景是什么?
答:适用场景:(
1)需要生成唯一的序列环境;(2)需要频繁实例然后销毁的对象;(3)创建对象需要太多的时间或资源,但经常使用;(4)方便资源相互通信的环境。4、为什么要有单例模式?
答:在实际的编程应用场景中,我们实际上只需要一个对象,如线程池对象、缓存、系统全球配置对象等。这可以确保不经常创建和销毁全球使用的类别,并节省系统资源。
5、实现java单例模式的要点是什么?
答:首先,我们应该确保整体情况只有一个类别的例子。我们应该确保这一点,至少类别的结构应该是私有的;单个例子的类别只能创建自己的例子,因为结构是私有的,但也有一个例子;单个例子必须能够向其他类别提供自己唯一的例子,即有一种公共方法可以返回单个例子的唯一例子。
6、实现java单例模式的几种模式?
答:(
1)饿汉式—静态常量模式(线程安全):在类加载过程中,初始化实例避免了多线程同步问题,自然线程安全。(
2)饿汉式—静态代码块模式(线程安全):事实上,静态常量饿汉式的实现略有变化,类实例化只是放在静态代码块中,其他没有区别。(
3)懒汉风格(线程不安全):这是最基本的实现方式。第一次调用是初始化的,实现了懒惰加载的特点。禁止在多线程场景中使用,因为它可能会产生多个对象,而不是单个案例。(
4)懒汉风格(线程安全,方法加同步锁):线程不安全懒汉风格的唯一区别在于,获取实例的getinstance()方法增加了同步锁。保证了多线程场景中的单个案例。但是效率会受损,但是还好。(
5)双校验锁(线程安全,效率高):在这种实现中,不需要每次都获得锁,减少了获得锁定和等待事件。注意使用volatile关键字,确保每个线程修改singleton静态实例域的可见性。(
6)静态内部类实现单例(线程安全、效率高):这种方式下 Singleton 类被装载,instance 不一定是初始化。因为 SingletonHolder 类别没有主动使用,只有通过显式调用 getInstance 只有在方法上,才会显式装载 SingletonHolder 类,从而实例化instance。7、java单例模式的基本特征?
答:持有自己类型的属性;类结构器私有;提供获取实例的静态方法。
8、饿汉和懒汉的区别
答:线程安全:饿汉自然是线程安全,可以直接用于
多线程
没有问题,懒汉本身是非线程安全的。
在资源加载和性能方面:饿汉风格在创建类别的同时实例化一个静态对象。无论以后是否会使用这个单个例子,它都会占据一定的内存,但相应地,它在第一次呼叫时会更快,因为它的资源已经初始化,顾名思义,懒汉风格会延迟加载,只有在第一次使用这个单个例子时才会实例化对象,如果你想做更多的工作,你应该在第一次呼叫时初始化,性能会有一些延迟,然后就像饿汉风格一样。
以上是java单例模式面试题的内容给出了相应的答案。我希望你能以答案为参考,努力学习java单例模式的内容,因为单例模式是java是最简单的设计模式之一,java面试侧重于基础知识的调查,因此java单例面试问题仍然需要学习重要知识点。