java单例模式的实现方式有哪些?

简介: java单例模式的实现方式有哪些?

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

相关文章
|
5月前
|
设计模式 安全 Java
JAVA设计模式1:单例模式,确保每个类只能有一个实例
JAVA设计模式1:单例模式,确保每个类只能有一个实例
|
5月前
|
设计模式 存储 安全
【设计模式——学习笔记】23种设计模式——单例模式Singleton(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——单例模式Singleton(原理讲解+应用场景介绍+案例介绍+Java代码实现)
22 0
|
3月前
|
设计模式 存储 Java
Java设计模式:解释一下单例模式(Singleton Pattern)。
Java设计模式:解释一下单例模式(Singleton Pattern)。
20 2
|
3月前
|
设计模式 Java
Java设计模式【一】:单例模式
Java设计模式【一】:单例模式
23 0
|
2天前
|
设计模式 安全 Java
Java设计模式之单例模式
在软件工程中,单例模式是一种常用的设计模式,其核心目标是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。Java作为一门广泛使用的编程语言,实现单例模式是面试和实际开发中的常见需求。
49 9
Java设计模式之单例模式
|
14天前
|
设计模式 Java 安全
[Java]单例模式
本篇文章主要阐述单例模式的基础实现,重心在于如何解决单例模式中的“线程安全”问题。不涉及理论。 如果文中阐述不全或不对的,多多交流。
35 0
[Java]单例模式
|
17天前
|
Java
JAVA基础--内部类和静态内部类、单例模式---静态内部类剖析
JAVA--内部类和静态内部类、单例模式---静态内部类剖析
29 9
|
17天前
|
存储 缓存 Java
Java volatile关键字-单例模式的双重锁为什么要加volatile
Java volatile关键字--单例模式的双重锁为什么要加volatile
40 10
|
2月前
|
设计模式 安全 Java
Java设计模式—单例模式的实现方式和使用场景
那么为什么要有单例模式呢?这是因为有的对象的创建和销毁开销比较大,比如数据库的连接对象。所以我们就可以使用单例模式来对这些对象进行复用,从而避免频繁创建对象而造成大量的资源开销。
44 1
|
6月前
|
安全 Java
深入理解Java单例模式和优化多线程任务处理
深入理解Java单例模式和优化多线程任务处理

相关产品

  • 云迁移中心