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

本文目录导航:

面试突击50:单例模式有几种写法?

单例模式是面试中的常客了,它的常见写法有 4 种:饿汉模式、懒汉模式、静态内部类和枚举,接下来我们一一来看。

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

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面试真题解析

面试合集:原文:

单例模式的N种实现方式

单例设计模式作为GOF 23设计模式中常见的一种,广泛应用于日常开发和第三方库中。

在面试场景中,初、中级程序员通常会遇到单例模式相关问题。

本文将梳理单例模式的7种实现方式,并分析它们各自的优缺点。

首先,饿汉式实现简单,一定义就创建实例,确保线程安全。

然而,当实例数据较大时,过早创建实例会导致资源占用。

懒汉式按需创建实例,避免了资源浪费,但在多线程环境下易出现线程安全问题。

为解决此问题,懒汉式+同步方法通过加锁保证线程安全,但每次请求都需获取锁,影响性能。

DCL(Double Check Lock)方式通过双重检查锁避免了直接加锁带来的性能损失,同时保证线程安全,还支持懒加载。

然而,这种方式在多线程环境下仍可能引发空指针异常,这是因为JVM运行时指令重排序问题。

使用volatile关键字可以防止重排序,解决此问题。

静态内部类实现单例模式,利用类加载机制完成实例化,提供较好的线程安全性和性能。

这种方式被称为IoDH(Initialization Demand Holder)技术,目前是使用较为广泛的方法之一。

枚举实现单例模式,禁止继承并保证线程安全,确保实例唯一。

通过枚举类的私有构造方法,防止外部非法创建对象。

然而,反射技术仍能突破枚举的唯一性限制。

针对此,枚举类在构造方法中进行处理,防止反射创建对象,确保唯一性。

总结,单例模式在实际开发和面试中频繁出现。

实现一个线程安全、高性能且不易被外部非法破坏的单例设计,需要综合考虑多种因素。

通常,静态内部类实现IoDH方式或枚举方式是较为理想的选择。

Python 实现单例模式的几种常见方式

单例模式(Singleton Pattern)确保类仅存在一个实例对象,广泛应用于节省内存资源和简化对象管理。

Python中有多种实现单例模式的方法,下面详细介绍几种常见方式。

模块实现单例:模块在首次导入时生成文件,避免重复执行,这使得模块成为一个天然的单例。

通过将相关函数和数据定义在一个模块中,实现模块的重复导入,达到单例效果。

装饰器实现单例:装饰器用于扩展函数或类的功能。

在装饰器中创建一个字典保存类实例。

首次创建时,将实例存入字典。

后续创建对象时,先检查字典中是否存在,如果存在则直接返回,否则创建实例并存储。

类方法实现单例:通过定义类方法检查类实例是否存在。

已有实例时返回,否则创建新实例。

确保仅创建一个实例。

使用__new__方法实现单例:在类的__new__方法中判断实例是否存在,如果存在返回,否则创建新实例。

此方法利用Python对象实例化过程,实现单例。

使用元类metaclass实现单例:元类控制类创建。

在元类的__call__方法中检查实例是否存在,存在返回,否则创建一个新实例,确保类只有一个实例。

存在多线程问题:在多线程环境下,多个线程可能同时创建实例,导致单例模式失效。

解决方法是在线程安全的上下文中获取对象属性并加锁,确保每个线程使用后释放锁,供下一个线程继续。

通过示例代码展示改进版的__new__方法和元类实现单例,具体实现细节将帮助开发者更好地理解单例模式在Python中的应用。

总结以上内容,是Python实现单例模式的多种方法。

学习这些方法有助于开发者优化代码、提高程序性能和资源利用效率。

希望本文对Python学习者有所助益。

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

相关推荐

php实时推送,php实地培训

2026年10月05日

53阅读

php乱码出现问号的原因,php乱码出现问号的原因有哪些

2026年10月05日

45阅读

php一句话木马,一句话木马ctf

2026年10月05日

48阅读

php获取数组长度,php中如何获取数组的长度

2026年10月05日

50阅读

php面试题库及答案,php程序员面试真题库

2026年10月05日

47阅读

phpcontent-type修改,php源码二次修改需要多少钱

2026年10月05日

42阅读