【了解一下,单例模式的实现方法--Java】

文章目录

  • 单例模式的实现方法--Java
    • [1. 饿汉式单例模式(在类加载时创建实例):](#1. 饿汉式单例模式(在类加载时创建实例):)
    • [2. 懒汉式单例模式(在需要时创建实例,线程不安全):](#2. 懒汉式单例模式(在需要时创建实例,线程不安全):)
    • [3. 静态内部类方式(懒加载,且线程安全):](#3. 静态内部类方式(懒加载,且线程安全):)
    • [4. 枚举方式:](#4. 枚举方式:)
    • [5. 使用容器实现单例:](#5. 使用容器实现单例:)
  • 小结:

单例模式的实现方法--Java

在Java中,可以使用多种方式来实现单例模式。以下是一些常见的单例模式实现方式:

1. 饿汉式单例模式(在类加载时创建实例):

java 复制代码
public class Singleton {
    private static final Singleton instance = new Singleton();

    private Singleton() {
        // 私有构造方法
    }

    public static Singleton getInstance() {
        return instance;
    }
}

2. 懒汉式单例模式(在需要时创建实例,线程不安全):

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

    private Singleton() {
        // 私有构造方法
    }

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

这种实现方式在多线程环境下可能会导致多个线程创建多个实例。为了确保线程安全,可以使用双重检查锁定(Double-Checked Locking):

java 复制代码
public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {
        // 私有构造方法
    }

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

3. 静态内部类方式(懒加载,且线程安全):

java 复制代码
public class Singleton {
    private Singleton() {
        // 私有构造方法
    }

    private static class SingletonHolder {
        private static final Singleton instance = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
}

这种方式实现了懒加载,且线程安全,因为静态内部类只会加载一次。

4. 枚举方式:

java 复制代码
public enum Singleton {
    INSTANCE;

    public void doSomething() {
        // 单例实例方法
    }
}

这是一种非常简单且线程安全的方式,枚举保证了只有一个枚举常量。

5. 使用容器实现单例:

java 复制代码
import java.util.HashMap;
import java.util.Map;

public class SingletonContainer {
    private static Map<String, Object> singletonMap = new HashMap<>();

    public static void registerSingleton(String key, Object singleton) {
        if (!singletonMap.containsKey(key)) {
            singletonMap.put(key, singleton);
        }
    }

    public static Object getSingleton(String key) {
        return singletonMap.get(key);
    }
}

这种方式允许你将多个单例对象存储在一个容器中,然后根据需要检索它们。

小结:

选择哪种方式取决于你的应用程序需求和线程安全要求。

在多线程环境中,双重检查锁定、静态内部类和枚举方式是比较常用的线程安全实现方式。

相关推荐
QX_hao26 分钟前
【Go】--map和struct数据类型
开发语言·后端·golang
你好,我叫C小白30 分钟前
C语言 循环结构(1)
c语言·开发语言·算法·while·do...while
无妄无望31 分钟前
docker学习(4)容器的生命周期与资源控制
java·学习·docker
MC丶科1 小时前
【SpringBoot 快速上手实战系列】5 分钟用 Spring Boot 搭建一个用户管理系统(含前后端分离)!新手也能一次跑通!
java·vue.js·spring boot·后端
千码君20161 小时前
React Native:从react的解构看编程众多语言中的解构
java·javascript·python·react native·react.js·解包·解构
夜白宋2 小时前
【word多文档docx合并】
java·word
Evand J2 小时前
【MATLAB例程】基于USBL和DVL的线性回归误差补偿,对USBL和DVL导航数据进行相互补偿,提高定位精度,附代码下载链接
开发语言·matlab·线性回归·水下定位·usbl·dvl
@yanyu6662 小时前
idea中配置tomcat
java·mysql·tomcat
2501_916766542 小时前
【项目部署】JavaWeb、MavenJavaWeb项目部署至 Tomcat 的实现方式
java·tomcat
RoboWizard3 小时前
扩容刚需 金士顿新款Canvas Plus存储卡
java·spring·缓存·电脑·金士顿