如何在Java中实现单例模式 (如何在jaVa版上玩烦人的村民)

本文目录导航:

如何在Java中实现单例模式?

单例模式大致有五种写法,分别为懒汉,恶汉,静态内部类,枚举和双重校验锁。

如何在Java中实现单例模式 (如何在jaVa版上玩烦人的村民)

1、懒汉写法,常用写法

什么是Java单例模式啊?

单例模式确保一个类只有一个实例,并向整个系统提供这个实例。

其特点包括:一个类只能有一个实例,自己创建这个实例,并在整个系统中提供这个实例。

例如,在对象图中,有一个“单例对象”,而“客户甲”、“客户乙”和“客户丙”是单例对象的三个客户对象。

所有客户对象共享同一个单例对象。

单例对象持有对自己实例的引用。

Singleton模式的主要作用是在Java应用程序中保证一个类Class只有一个实例存在。

在需要进行单线程操作的场景中,例如建立目录或数据库连接,或者管理内部和外部资源时,单例模式尤为重要。

外部资源管理的例子包括:每台计算机可以有多个打印机,但只能有一个Printer Spooler,以防止两个打印作业同时输出到打印机。

同样,每台计算机可以有多个通信端口,系统应当集中管理这些端口,以防止一个端口被两个请求同时调用。

内部资源管理的例子包括:大多数软件系统都有一个或多个属性文件存放系统配置,这些属性文件应当由一个对象来管理。

例如,Windows回收站只能有一个实例,整个系统都使用这个唯一的实例,而回收站自行提供自己的实例。

因此,回收站是单例模式的一个典型应用。

单例模式有两种实现形式:1. 饿汉式单例类javapublic class Singleton {private Singleton() {} // 私有构造函数,只供内部调用private static Singleton instance = new Singleton(); // 静态实例public static Singleton getInstance() { // 提供静态方法供外部访问return instance;}}2. 懒汉式单例类javapublic class Singleton {private static Singleton instance = null; // 延迟初始化public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton(); // 第一次调用时创建实例}return instance;}}懒汉式单例类的特点是延迟初始化,即第一次调用时才创建实例,后续调用不再重复创建,提高了效率。

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

面试合集:原文:

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

相关推荐

php实时推送,php实地培训

2026年10月05日

53阅读

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

2026年10月05日

44阅读

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阅读