面试突击50 单例形式有几种写法 (面试突击班价格java)

面试突击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;}}

好处:成功便捷、不存在线程安保疑问。

缺陷:类加载时就创立了对象,创立之后假设没被经常使用,就形成了资源糜费的状况。

2.懒汉形式

懒汉形式和饿汉形式正好是同样的,所谓的懒汉形式也就是懒加载(提前加载),指的是它只要在第一次性被经常使用时,才会被初始化,它的实现代码如下:

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、这是个便捷的方法,在不思考并发的时刻这也是个不错的选用。

但实践上,一个网站是并发的,并且有或者是存在少量并发操作的。

假设咱们对每次写入都创立一个数据库衔接,那么很容易的系统会产生瓶颈,系统的精神将会很多的放在保养链接上而非间接查问操作上。

这显然是无法取的。

参考资料起源: 网络百科-单例形式

为什么单例形式要起名叫饿汉式和懒汉式?

单例形式在命名时,以“饿汉式”与“懒汉式”区分代表其创立实例的形式,笼统地反映了对象实例创立机遇的不同。

“饿汉式”形式似乎预先预备食物的饿汉,不等真正需求产生,就在程序进行时预先创立对象实例。

这种战略实用于对象创立老本较低,且频繁被调用的场景,确保程序运转时一直领有所需实例,以优化效率。

相比之下,“懒汉式”形式则像一个懒于进食的集体,在真正须要时才被动失掉食物。

在对象经常使用频率不高,且占用资源较多的状况下,驳回“懒汉式”可以有效防止资源糜费,优化系统的全体功能。

“饿汉式”与“懒汉式”单例形式的命名,经过比喻活泼地展现了它们在对象实例化机遇上的差异,指点开发者依据详细需求灵敏选用适合的成功形式,以到达最优的程序设计成果。

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

25阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

25阅读