单例模式的几种实现方式

在Java中,实现单例模式主要有几种方式:懒汉式、饿汉式、双重检查锁定、静态内部类和枚举。每种方式都有其特点和适用场景。

1. 饿汉式(线程安全)

饿汉式是最简单的一种实现方式,通过静态初始化实例,保证了线程安全。但它不是懒加载模式,无法在实际使用时才创建实例。

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

    private Singleton() {
   }

    public static Singleton getInstance() {
   
        return instance;
    }
}

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

懒汉式实现了懒加载,但在多线程情况下不能保证单例的唯一性。

public class Singleton {
   
    private static Singleton instance;

    private Singleton() {
   }

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

3. 懒汉式(线程安全)

通过同步方法保证线程安全,但每次访问时都需要同步,会影响性能。

public class Singleton {
   
    private static Singleton instance;

    private Singleton() {
   }

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

4. 双重检查锁定(DCL)

双重检查锁定既保证了线程安全,又避免了每次访问时的性能损失。

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

5. 静态内部类

使用静态内部类的方式实现懒加载,且由JVM保证线程安全。

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

    private Singleton() {
   }

    public static Singleton getInstance() {
   
        return SingletonHolder.INSTANCE;
    }
}

6. 枚举

使用枚举的方式是实现单例的最佳方法,不仅能避免多线程同步问题,还能防止反序列化重新创建新的对象。

// 实现枚举单例
public enum Singleton {
   
    INSTANCE; // 唯一的枚举实例

    // 枚举类中可以包含成员变量、方法等
    private int value;

    // 可以定义自己需要的操作,如设置、获取枚举实例的状态等
    public int getValue() {
   
        return value;
    }

    public void setValue(int value) {
   
        this.value = value;
    }

    // 还可以定义其他方法
    public void show() {
   
        System.out.println("This is an enum singleton method.");
    }
}

// 使用枚举单例
public class TestSingleton {
   
    public static void main(String[] args) {
   
        Singleton singleton = Singleton.INSTANCE;

        singleton.setValue(1);
        System.out.println(singleton.getValue());

        singleton.show();
    }
}

相关推荐

  1. 模式实现方式

    2024-02-20 07:16:02       44 阅读
  2. 模式实现方式

    2024-02-20 07:16:02       49 阅读
  3. 模式实现方式

    2024-02-20 07:16:02       36 阅读
  4. Python 实现模式方式以及存在问题

    2024-02-20 07:16:02       58 阅读
  5. Android实现方式

    2024-02-20 07:16:02       29 阅读
  6. 模式实现方式

    2024-02-20 07:16:02       42 阅读
  7. 模式实现方式总结

    2024-02-20 07:16:02       27 阅读
  8. 创建模式方式

    2024-02-20 07:16:02       33 阅读
  9. 模式(五创建方式

    2024-02-20 07:16:02       62 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-20 07:16:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-20 07:16:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-20 07:16:02       82 阅读
  4. Python语言-面向对象

    2024-02-20 07:16:02       91 阅读

热门阅读

  1. 设计模式一:单例模式

    2024-02-20 07:16:02       48 阅读
  2. 单例模式双端检测详解

    2024-02-20 07:16:02       48 阅读
  3. 【WPF】获取父控件数据

    2024-02-20 07:16:02       62 阅读
  4. WhisperFusion:具有超低延迟无缝对话功能的AI系统

    2024-02-20 07:16:02       40 阅读
  5. WPF 在控件上预留一个占位给到调用方使用

    2024-02-20 07:16:02       48 阅读
  6. WPF大杂烩

    2024-02-20 07:16:02       46 阅读
  7. OFD文件WEB前端展示-easyofd(1.0.6)

    2024-02-20 07:16:02       48 阅读
  8. 历年CSP-J(NOIP普及组)考点分析与分类汇总

    2024-02-20 07:16:02       45 阅读
  9. ADO.NET事务处理

    2024-02-20 07:16:02       47 阅读
  10. oracle和mysql语句有哪些异同点?

    2024-02-20 07:16:02       61 阅读
  11. 如何在Win11系统中使用ubuntu(WSL)终端编译 Rust 程序

    2024-02-20 07:16:02       51 阅读