在Java中实现单例模式的正确方法

简介: 在Java中实现单例模式的正确方法

引言

单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供全局访问点。在Java中实现单例模式需要考虑多线程环境下的安全性、延迟初始化以及序列化等问题。

1. 饿汉式单例模式

饿汉式单例模式在类加载时就创建实例,线程安全,但可能会造成资源浪费。

package cn.juwatech.singleton;
public class EagerSingleton {
    private static final EagerSingleton instance = new EagerSingleton();
    private EagerSingleton() {
        // 私有构造方法
    }
    public static EagerSingleton getInstance() {
        return instance;
    }
}

2. 懒汉式单例模式(线程不安全)

最简单的懒汉式单例模式,延迟实例化,但在多线程环境下不安全。

package cn.juwatech.singleton;
public class LazySingleton {
    private static LazySingleton instance;
    private LazySingleton() {
        // 私有构造方法
    }
    public static LazySingleton getInstance() {
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}

3. 懒汉式单例模式(双重检查锁)

通过双重检查锁定(double-checked locking)实现延迟初始化,并保证线程安全性。

package cn.juwatech.singleton;
public class DoubleCheckedSingleton {
    private static volatile DoubleCheckedSingleton instance;
    private DoubleCheckedSingleton() {
        // 私有构造方法
    }
    public static DoubleCheckedSingleton getInstance() {
        if (instance == null) {
            synchronized (DoubleCheckedSingleton.class) {
                if (instance == null) {
                    instance = new DoubleCheckedSingleton();
                }
            }
        }
        return instance;
    }
}

4. 静态内部类单例模式

利用Java的类加载机制,实现延迟初始化,线程安全。

package cn.juwatech.singleton;
public class StaticInnerClassSingleton {
    private StaticInnerClassSingleton() {
        // 私有构造方法
    }
    private static class SingletonHolder {
        private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();
    }
    public static StaticInnerClassSingleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

5. 枚举单例模式

枚举类型在Java中天生支持单例模式,线程安全且实现简洁。

package cn.juwatech.singleton;
public enum EnumSingleton {
    INSTANCE;
    // 可选的成员变量和方法
    // ...
    public void doSomething() {
        // 单例方法实现
    }
}

6. 总结

本文介绍了在Java中实现单例模式的几种常见方法,包括饿汉式、懒汉式(线程不安全和双重检查锁)、静态内部类和枚举单例模式。每种方法都有其适用的场景和优缺点,在选择时需要根据具体需求和线程安全性要求进行权衡。

相关文章
|
2天前
|
设计模式 缓存 安全
Java设计模式的单例模式应用场景
Java设计模式的单例模式应用场景
17 4
|
2天前
|
Java
深入了解Java中的BigDecimal类及其方法
深入了解Java中的BigDecimal类及其方法
9 1
|
2天前
|
Java 编译器
Java健壮性 Java可移植性 JDK, JRE, JVM三者关系 Java的加载与执行原理 javac编译与JAVA_HOME环境变量介绍 Java中的注释与缩进 main方法的args参数
Java健壮性 Java可移植性 JDK, JRE, JVM三者关系 Java的加载与执行原理 javac编译与JAVA_HOME环境变量介绍 Java中的注释与缩进 main方法的args参数
5 1
|
2天前
|
安全 Java UED
深度解析Java中方法内的异步调用实践与应对方案
深度解析Java中方法内的异步调用实践与应对方案
8 1
|
2天前
|
监控 Java
优化Java应用的日志记录方法
优化Java应用的日志记录方法
|
2天前
|
Java 编译器 索引
解决Java中的NoSuchElementException异常的常见方法
解决Java中的NoSuchElementException异常的常见方法
|
2天前
|
存储 缓存 安全
Java List操作详解及常用方法
Java List操作详解及常用方法
|
2天前
|
Java 数据安全/隐私保护
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
9 0
|
2天前
|
存储 Java
Java基础手册(标识符 关键字 字面值 变量 数据类型 字符编码 运算符 控制语句 方法及方法重载和递归 面向对象与面向过程)
Java基础手册(标识符 关键字 字面值 变量 数据类型 字符编码 运算符 控制语句 方法及方法重载和递归 面向对象与面向过程)
7 0
|
Java
ABAP和Java单例模式的攻防
ABAP和Java单例模式的攻防
83 0
ABAP和Java单例模式的攻防