登录
首页 >  文章 >  java教程

Java单例模式实现方式详解

时间:2025-11-06 17:06:28 490浏览 收藏

**Java单例模式**是保证一个类只有一个实例并提供全局访问点的常用设计模式。本文深入探讨**Java单例模式的几种实现方式**,包括:**饿汉式**、**懒汉式**、**双重检查锁**和**静态内部类**。饿汉式简单但可能造成资源浪费;懒汉式线程安全但性能较低;**双重检查锁**和**静态内部类**是推荐的实现方式,它们兼顾了线程安全和性能,尤其双重检查锁需要注意`volatile`关键字的使用,防止指令重排。所有实现的关键在于**私有化构造方法**,防止外部实例化。选择哪种方式取决于具体的应用场景和性能需求。

单例模式确保一个类仅有一个实例并提供全局访问点。饿汉式在类加载时创建实例,线程安全但不支持懒加载;懒汉式通过synchronized实现线程安全的延迟加载,但性能较差;双重检查锁通过volatile和同步块结合,既保证线程安全又提升性能,推荐使用;静态内部类利用类加载机制实现懒加载和线程安全,也是推荐方式。两种推荐方式均避免了不必要的同步开销,且能正确处理多线程环境下的实例唯一性。构造方法必须私有化以防止外部实例化,这是实现单例的关键细节。

Java中单例模式实现方法

单例模式确保一个类只有一个实例,并提供全局访问点。在Java中,有多种实现方式,每种都有其适用场景和优缺点。

饿汉式(静态常量)

类加载时就创建实例,线程安全,但不管是否使用都会创建对象。

public class Singleton {
    private static final Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}

懒汉式(线程安全)

延迟加载,在第一次调用时才创建实例。通过synchronized保证线程安全,但性能较低。

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

双重检查锁(推荐)

既保证延迟加载,又提高性能,只在必要时加锁。需使用volatile防止指令重排。

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;
    }
}

静态内部类(推荐)

利用类加载机制保证线程安全,且支持懒加载。只有调用getInstance时才会加载内部类。

public class Singleton {
    private Singleton() {}
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

基本上就这些常见写法。双重检查锁和静态内部类是实际开发中最常用的,兼顾了性能与安全。注意构造方法必须私有,避免外部new对象。不复杂但容易忽略细节。

今天关于《Java单例模式实现方式详解》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>