单例模式(Singleton Pattern)

目录

一、单例模式的实现方式

[1. 懒汉式(Lazy Initialization)](#1. 懒汉式(Lazy Initialization))

(1)代码

(2)缺点

[2. 线程安全的懒汉式](#2. 线程安全的懒汉式)

(1)代码

(2)缺点

[3. 双重检索锁(Double-Check Locking)](#3. 双重检索锁(Double-Check Locking))

代码

[4. 饿汉式(Hungry Initialization)](#4. 饿汉式(Hungry Initialization))

(1)代码

(2)优点

[5. 使用枚举](#5. 使用枚举)

代码

二、使用单例模式的注意事项

1、序列化保护

2、懒加载和性能

3、内存泄露


单例模式是设计模式中的一种重要模式,主要用于确保一个类只有一个实例,并提供一个全局访问点。它在许多场景中都非常有用,比如在配置管理、线程池、日志记录等中。

一、单例模式的实现方式

单例模式通常有几种常见的实现方式:

1. 懒汉式(Lazy Initialization)

在这种实现方式中,单例实例是在第一次使用时创建的,直到那时才实例化。这种方式是延迟加载。

(1)代码
java 复制代码
public class Singleton {
       private static Singleton instance;

       private Singleton() {
           // 私有构造函数防止外部实例化
       }

       public static Singleton getInstance() {
           if (instance == null) {
               instance = new Singleton();
           }
           return instance;
       }
   }
(2)缺点

在多线程环境下,可能会导致创建多个实例。

2. 线程安全的懒汉式

为了在多线程环境中确保安全,可以使用 synchronized 关键字

(1)代码
java 复制代码
public class Singleton {
       private static Singleton instance;

       private Singleton() {}

       public static synchronized Singleton getInstance() {
           if (instance == null) {
               instance = new Singleton();
           }
           return instance;
       }
   }
(2)缺点

每次调用 getInstance 时都需要加锁,可能影响性能。

3. 双重检索锁(Double-Check Locking)

通过双重检查来减少同步开销

public class Singleton {

private static Singleton instance;

代码
java 复制代码
   private Singleton() {}

       public static Singleton getInstance() {
           if (instance == null) {
               synchronized (Singleton.class) {
                   if (instance == null) {
                       instance = new Singleton();
                   }
               }
           }
           return instance;
       }
   }
4. 饿汉式(Hungry Initialization)

实例在类加载时创建,不需要延迟加载。

(1)代码
java 复制代码
  public class Singleton {
       // 静态实例在加载的时候创建
       private static final Singleton instance = new Singleton();

       private Singleton() {}

       public static Singleton getInstance() {
           return instance;
       }
   }
(2)优点

线程安全,简单;缺点是在类加载时就创建了实例,可能会浪费资源。

5. 使用枚举

Java的枚举可以很好地实现单例模式,既简单又线程安全。

代码
java 复制代码
 public enum Singleton {
       INSTANCE;

       public void someMethod() {
           // 业务逻辑
       }
   }

二、使用单例模式的注意事项

1、序列化保护

如果单例类实现了`Serializable`接口,必须定义`readResolve`方法,以防止在反序列化时创建新的实例。

2、懒加载和性能

选择懒加载时要考虑性能问题,尤其是在多线程环境中。

3、内存泄露

确保使用强引用,不要因单例导致内存泄露。

相关推荐
cynicme15 小时前
力扣3318——计算子数组的 x-sum I(偷懒版)
java·算法·leetcode
阿巴~阿巴~16 小时前
线程安全单例模式与懒汉线程池的实现与优化
linux·服务器·单例模式·线程池·饿汉模式·懒汉模式·静态方法
不光头强16 小时前
Java中的单例模式
单例模式
青云交16 小时前
Java 大视界 -- Java 大数据在智能教育学习效果评估与教学质量改进实战
java·实时分析·生成式 ai·个性化教学·智能教育·学习效果评估·教学质量改进
崎岖Qiu16 小时前
【设计模式笔记17】:单例模式1-模式分析
java·笔记·单例模式·设计模式
Lei活在当下17 小时前
【现代 Android APP 架构】09. 聊一聊依赖注入在 Android 开发中的应用
java·架构·android jetpack
不穿格子的程序员17 小时前
从零开始刷算法-栈-括号匹配
java·开发语言·
lkbhua莱克瓦2417 小时前
Java练习-正则表达式 1
java·笔记·正则表达式·github
yue00817 小时前
C#类继承
java·开发语言·c#
凯芸呢18 小时前
Java中的数组(续)
java·开发语言·数据结构·算法·青少年编程·排序算法·idea