Java单例模式

单例模式

是Java常用的一种设计模式,主要目的是为了确保一个类在整个系统中只有一个实例。

单例模式可以分为3种主要类型,懒汉式,饿汉式,登记式。

懒汉式

在类加载时不初始化,而是在第一次被使用时才初始化。

需要注意线程安全问题,双重检查。

java 复制代码
/**

 java 指令重排序:

 在这个例子中,Singleton类使用双重检查锁定模式来确保instance字段只被初始化一次。在没有指令重排序的情况下,这个实现看起来是线程安全的。然而,由于Java内存模型和指令重排序的存在,这个实现可能会引发问题。

 问题出在instance = new Singleton();这行代码上。这行代码实际上包含了三个操作:

 1. 分配内存给Singleton对象。

 2. 调用Singleton类的构造函数初始化对象。

 3. 将instance字段指向新创建的对象。

 由于指令重排序,这三个操作的实际执行顺序可能与上述顺序不同。例如,处理器可能先执行第3步,然后再执行第1步和第2步。在这种情况下,另一个线程可能会看到instance字段不为null,但实际上对象还没有完全初始化,从而导致不可预测的行为。

 为了解决这个问题,可以将instance字段声明为volatile,以确保其初始化过程中的指令不会被重排序:

 */
public class Singleton {

    private static volatile Singleton singleton = null;

    private Singleton(){};

    public Singleton getSingleton(){
        if(null == singleton){ // 第一次检查
            synchronized(Singleton.class){
                if(null == singleton){ // 第二次检查
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

饿汉式

在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快。

相关推荐
dialect_3 小时前
KMP算法
开发语言·c++·算法
captain3763 小时前
MyBatis(入门5)其他查询操作
java·数据库·spring boot·mybatis
Novproxy_Z3 小时前
商用代理避坑:如何识别商家拿机房 IP 冒充住宅 IP
java·网络·tcp/ip
总要学点什么4 小时前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节
文丑颜不良啊4 小时前
LeetCode1481~1500题目解析
java·leetcode
2601_962885724 小时前
quotes 字段全解:涨跌幅、振幅、换手率的口径与单位
java·前端·spring
前端精髓5 小时前
调用openrouter的免费API模型
java·前端·javascript
步行cgn5 小时前
Spring MVC 拦截器 Interceptor 详解:从执行流程到实战应用
java·spring·mvc
文丑颜不良啊5 小时前
LeetCode1381~1400题目解析
java·leetcode
开开心心_Every5 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea