Java中的单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点

简介: Java单例模式确保类仅有一个实例,并提供全局访问点。常见实现包括:- 饿汉式:静态初始化,线程安全。- 懒汉式:延迟初始化,需同步保证线程安全。- 双重检查锁定:优化懒汉式,减少同步开销。- 静态内部类:延迟加载,线程安全。- 枚举:简洁线程安全,不适用于复杂构造。- 容器实现:如Spring框架,用于依赖注入。选择依据需求,如延迟加载、线程安全和扩展性。

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

饿汉式(Eager Initialization):
静态初始化时创建唯一实例。
线程安全,因为实例在类加载时就创建了。
public class Singleton {

private static final Singleton INSTANCE = new Singleton();

private Singleton() {

}

public static Singleton getInstance() {

    return INSTANCE;
}

}
懒汉式(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;
}

}
双重检查锁定(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;
}

}
静态内部类(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;
}

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

INSTANCE;

public void doSomething() {

    //...
}

}

// 获取单例实例
Singleton singleton = Singleton.INSTANCE;
singleton.doSomething();
容器实现(Container):
可以使用Spring框架或其他依赖注入框架提供的机制来创建和管理单例对象。
以上就是Java中实现单例模式的一些常见方法。选择哪种方式取决于你的需求,包括是否需要延迟加载、线程安全以及可扩展性等。

相关文章
|
4月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
202 4
|
4月前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
272 5
|
4月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
260 2
|
9月前
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
285 16
|
9月前
|
设计模式 负载均衡 监控
并发设计模式实战系列(2):领导者/追随者模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第二章领导者/追随者(Leader/Followers)模式,废话不多说直接开始~
275 0
|
9月前
|
设计模式 监控 Java
并发设计模式实战系列(1):半同步/半异步模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第一章半同步/半异步(Half-Sync/Half-Async)模式,废话不多说直接开始~
300 0
|
9月前
|
设计模式 安全 Java
并发设计模式实战系列(12):不变模式(Immutable Object)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第十二章,废话不多说直接开始~
226 0
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
825 11
|
9月前
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式