Java单例模式确保类仅有一个实例,提供全局访问点。常见实现包括

简介: 【6月更文挑战第23天】Java单例模式确保类仅有一个实例,提供全局访问点。常见实现包括:1. 饿汉式:静态初始化时创建实例,线程安全。2. 懒汉式:首次请求时创建,需同步保障线程安全。3. 双重检查锁定:优化懒汉式,减少同步开销。4. 静态内部类:延迟加载,线程安全。5. 枚举:简洁线程安全,但构造受限。6. 容器实现:如Spring框架,适用于依赖注入。选择依据需求如延迟加载、线程安全等。

Java中的单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点。根据实现方式的不同,有多种不同的实现单例模式的方法。以下是几种常见的Java单例模式的实现方式:

  1. 饿汉式(Eager Initialization)
    • 静态初始化时创建唯一实例。
    • 线程安全,因为实例在类加载时就创建了。
public class Singleton {
   
    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {
   }

    public static Singleton getInstance() {
   
        return INSTANCE;
    }
}
  1. 懒汉式(Lazy Initialization)
    • 当第一次被请求时才创建唯一实例。
    • 由于线程不安全,可能会产生多个实例,需要添加同步代码块或锁来确保线程安全。
public class Singleton {
   
    private volatile static Singleton instance;

    private Singleton() {
   }

    public static synchronized Singleton getInstance() {
   
        if (instance == null) {
   
            instance = new Singleton();
        }
        return instance;
    }
}
  1. 双重检查锁定(Double-Checked Locking)
    • 基于懒汉式的改进版本,只有在第一次实例化时才进行同步,避免每次获取实例都进行同步操作。
    • 自从JDK 1.5及更高版本支持volatile关键字后,这是一种推荐的实现方法。
public class Singleton {
   
    private volatile static Singleton instance;

    private Singleton() {
   }

    public static Singleton getInstance() {
   
        if (instance == null) {
   
            synchronized (Singleton.class) {
   
                if (instance == null) {
   
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
  1. 静态内部类(Static Nested Class)
    • 利用静态内部类的特性,在外部类被加载时并不会立即初始化静态内部类,因此实现了延迟加载。
    • 只有当第一次调用getInstance()方法时才会加载静态内部类并创建唯一的实例。
    • 这种实现是线程安全的,而且没有性能开销。
public class Singleton {
   
    private Singleton() {
   }

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

    public static Singleton getInstance() {
   
        return SingletonHolder.INSTANCE;
    }
}
  1. 枚举(Enum)
    • 使用枚举可以很容易地创建单例,且枚举默认是线程安全的。
    • 枚举的方式简洁,但可能不适合一些需要控制构造过程或者与其他设计模式结合的情况。
public enum Singleton {
   
    INSTANCE;

    public void doSomething() {
   
        //...
    }
}

// 获取单例实例
Singleton singleton = Singleton.INSTANCE;
singleton.doSomething();
  1. 容器实现(Container)
    • 可以使用Spring框架或其他依赖注入框架提供的机制来创建和管理单例对象。

以上就是Java中实现单例模式的一些常见方法。选择哪种方式取决于你的需求,包括是否需要延迟加载、线程安全以及可扩展性等。

相关文章
|
4天前
|
设计模式 安全 Java
Java编程中的单例模式:理解与实践
【10月更文挑战第31天】在Java的世界里,单例模式是一种优雅的解决方案,它确保一个类只有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的实现方式、使用场景及其优缺点,同时提供代码示例以加深理解。无论你是Java新手还是有经验的开发者,掌握单例模式都将是你技能库中的宝贵财富。
12 2
|
7天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
35 17
|
3天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
28 4
|
4天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
12 2
|
4天前
|
设计模式 安全 Java
Java编程中的单例模式深入解析
【10月更文挑战第31天】在编程世界中,设计模式就像是建筑中的蓝图,它们定义了解决常见问题的最佳实践。本文将通过浅显易懂的语言带你深入了解Java中广泛应用的单例模式,并展示如何实现它。
|
8天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
安全 Java
Java常用的单例模式
Java常用的单例模式
119 0
|
安全 Java
Java常用的单例模式
版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/46608497 Java的单例single经常用到,但是使用枚举enum最佳。
941 0
|
10天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
1天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
下一篇
无影云桌面