• 如何在Java中实现单例模式?


    在Java中实现单例模式(Singleton Pattern)主要有几种方式。单例模式的核心思想是确保一个类只有一个实例,并提供一个全局访问点。以下是几种常见的实现方式:

    ### 1. 懒汉式(线程不安全)

    java
    public class Singleton {
        private static Singleton instance;
        private Singleton() {}
        
        public static Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }
    ```
    这种方式是最基本的实现方式,但是在多线程环境下是不安全的。

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

    ```java
    public class Singleton {
        private static Singleton instance;
        private Singleton() {}
        
        public static synchronized Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }
    ```
    通过添加`synchronized`关键字使得在多线程环境下是安全的,但是每次访问都要进行线程锁定判断,影响性能。

    ### 3. 饿汉式(线程安全)

    ```java
    public class Singleton {
        private static final Singleton instance = new Singleton();
        private Singleton() {}
        
        public static Singleton getInstance() {
            return instance;
        }
    }
    ```
    这种方式基于classloder机制避免了多线程的同步问题,但是在类装载时就进行了实例化,没有达到Lazy Loading的效果。

    ### 4. 双重校验锁(Double-Checked Locking)

    ```java
    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;
        }
    }
    ```
    双重校验锁法既保证了懒加载也保证了线程安全,但由于Java内存模型的原因,需要将`instance`变量声明为`volatile`。

    ### 5. 静态内部类(线程安全)

    ```java
    public class Singleton {
        private static class SingletonHolder {
            private static final Singleton INSTANCE = new Singleton();
        }
        private Singleton() {}
        
        public static final Singleton getInstance() {
            return SingletonHolder.INSTANCE;
        }
    }
    ```
    利用静态内部类的特性,实现了Lazy Loading,并且保证了线程安全。这种方式推荐使用。

    ### 6. 枚举(线程安全)

    ```java
    public enum Singleton {
        INSTANCE;
        public void whateverMethod() {
        }
    }
    ```
    使用枚举的方式实现单例不仅简单,而且在语言层面上保证了实例的唯一性和线程安全性,同时还自动支持序列化机制,防止反序列化重新创建新的对象。这种方式是最推荐的单例实现方式。

    以上是Java中实现单例模式的几种方式,根据实际情况选择适合的实现方式。

  • 相关阅读:
    R语言用逻辑回归预测BRFSS中风数据、方差分析anova、ROC曲线AUC、可视化探索
    【杂记】高并发的几种设计模式
    关于开展2023年度光明科学城出站博士后生活资助申报工作的通知
    spring boot单元测试之druid NullPointException问题解决
    汽车螺丝扭力标准/汽车常见螺栓扭矩参照
    协议和分层次
    java+ssm基于微信小程序的游泳馆管理系统 uniapp 小程序
    【技术解密】RabbitMQ消息积压不消费怎么办?小米给你最佳解决方案!
    Linux Bridge(网桥)
    综述---知识蒸馏
  • 原文地址:https://blog.csdn.net/2301_79507619/article/details/136210487