面试突击50 单例形式有几种写法 (面试突击班价格java)
本文目录导航:
面试突击50:单例形式有几种写法?
单例形式是面试中的常客了,它的经常出现写法有 4 种:饿汉形式、懒汉形式、静态外部类和枚举,接上去咱们逐一来看。
1.饿汉形式饿汉形式也叫预加载形式,它是在类加载时间接创立并初始化单例对象,所以它并不存在线程安保的疑问。它是依托 ClassLoader 类机制,在程序进行时只加载一次性,因此不存在线程安保疑问,它的实现代码如下:
public class Singleton {// 1.防止外部间接 new 对象破坏单例形式private Singleton() {}// 2.经过私有变量保留单例对象private static Singleton instance = new Singleton();// 3.提供公共失掉单例对象的方法public static Singleton getInstance() {return instance;}}
好处:成功便捷、不存在线程安保疑问。
缺陷:类加载时就创立了对象,创立之后假设没被经常使用,就形成了资源糜费的状况。
懒汉形式和饿汉形式正好是同样的,所谓的懒汉形式也就是懒加载(提前加载),指的是它只要在第一次性被经常使用时,才会被初始化,它的实现代码如下:
public class Singleton {// 1.防止外部间接 new 对象破坏单例形式private Singleton() {}// 2.经过私有变量保留单例对象private static volatile Singleton instance = null;// 3.提供公共失掉单例对象的方法public static Singleton getInstance() {if (instance == null) { // 第一次性效验synchronized () {if (instance == null) { // 第二次效验instance = new Singleton();}}}return instance;}}懒汉形式经常使用的是双重效验锁和 volatile 来保障线程安保的,从上述代码可以看出,无论是饿汉形式还是懒汉形式,它们的成功步骤都是一样的:
创立一个私有的结构方法,防止其余调用的中央间接 new 对象,这样创立进去的对象就不是单例对象了。
创立一个私有变量来保留单例对象。
提供一个公共的方法前往单例对象。
懒汉形式相比于饿汉形式来说,不会形成资源的糜费,但写法要复杂一些。
3.静态外部类静态外部类既能保障线程安保,又能保障懒加载,它只要在被调用时,才会经过 ClassLoader 机制来加载和初始化外部静态类,因此它是线程安保的,此形式的实现代码如下:
public class Singleton {// 1.防止外部间接 new 对象破坏单例形式private Singleton() {}// 2.静态外部类private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}// 3.提供公共失掉单例对象的方法public static final Singleton getInstance() {return ;}}4.枚举枚举也是在第一次性被经常使用时,才会被 Java 虚构机加载并初始化,所以它也是线程安保的,且是懒加载的,它的实现代码如下:
public enumEnumSingleton {INSTANCE;public EnumSingleton getInstance(){return INSTANCE;}}总结
单例形式实用于经常被访问的对象,或是创立和销毁须要调用少量资源和期间的对象,经常使用单例形式可以防止频繁创立和销毁对象。
单例形式的罕用成功方法有 4 种:饿汉形式、懒汉形式、静态外部类和枚举。
从写法的繁复性、线程安保性和代码的易懂性等方面综合来看,博主比拟介绍经常使用枚举或懒汉形式来成功单例形式。
是非审之于己,毁誉听之于人,得失安之于数。
群众号:Java面试真题解析
面试合集:原文:
单例中懒汉和饿汉的实质区别?
1、饿汉式是线程安保的,在类创立的同时就曾经创立好一个静态的对象供系统经常使用,以后不在扭转。
懒汉式假设在创立实例对象时不加上synchronized则会造成对对象的访问不是线程安保的。
2、从成功形式来讲他们最大的区别就是懒汉式是延时加载,他是在须要的时刻才创立对象,而饿汉式在虚构机进行的时刻就会创立,饿汉式无需关注多线程疑问,写法便捷明了,能用则用。
真正用到的时刻才去建这个单例对象,“饿汉式”是在不论用不用得上,一开局就建设这个单例对象。
1、单件形式用途:单件形式属于工厂形式的特例,只是它不须要输入参数并且一直前往同一对象的援用。
2、它的用途十分宽泛,打个比如,咱们开发了一个便捷的留言板,用户的每一次性留言都要将留言消息写入到数据库中,最直观的方法是没次写入都建设一个数据库的链接。
3、这是个便捷的方法,在不思考并发的时刻这也是个不错的选用。
参考资料起源:
单件形式能够保障某一类型对象在系统中的惟一性,即某类在系统中只要一个实例。
但实践上,一个网站是并发的,并且有或者是存在少量并发操作的。
假设咱们对每次写入都创立一个数据库衔接,那么很容易的系统会产生瓶颈,系统的精神将会很多的放在保养链接上而非间接查问操作上。
这显然是无法取的。
为什么单例形式要起名叫饿汉式和懒汉式?
单例形式在命名时,以“饿汉式”与“懒汉式”区分代表其创立实例的形式,笼统地反映了对象实例创立机遇的不同。
“饿汉式”形式似乎预先预备食物的饿汉,不等真正需求产生,就在程序进行时预先创立对象实例。
这种战略实用于对象创立老本较低,且频繁被调用的场景,确保程序运转时一直领有所需实例,以优化效率。
相比之下,“懒汉式”形式则像一个懒于进食的集体,在真正须要时才被动失掉食物。
在对象经常使用频率不高,且占用资源较多的状况下,驳回“懒汉式”可以有效防止资源糜费,优化系统的全体功能。
“饿汉式”与“懒汉式”单例形式的命名,经过比喻活泼地展现了它们在对象实例化机遇上的差异,指点开发者依据详细需求灵敏选用适合的成功形式,以到达最优的程序设计成果。