单例模式java⾯试题_8道常考Java单例模式⾯试题
Java单例设计模式是GoF23种设计模式之⼀,也是是使⽤频率最⾼的设计模式之⼀,所以想参加java程序员岗位⾯试的朋友们,必须要提前学习好java单例模式⾯试题的内容,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单例模式⾯试题还是⼗分有必要学习的重要知识点。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论