单例模式的初识

1.1基本概念

单例模式是一个设计模式,确保一个类只有一个实例,并提供一个全局访问点

场景:需要严格控制资源访问(数据库连接池,配置文件读取)

避免资源浪费和冲突

1.2实现方法

单例模型的实现方法分为:懒汉式,饿汉式

1.3饿汉式

饿汉式:在启动程序时,无论是否被使用,进行单例对象的初始化,

不需要线程安全

优点

不考虑多线程环境下的线程安全

缺点

浪费系统资源

代码

java 复制代码
package sigletondemo;
//单例模式
//饿汉式
public class Singleton {
    //定义静态
    private static Singleton instance = new Singleton();
    //私有的,构造方法
    private Singleton(){}
    //调用
    public static Singleton getInstance(){
        return instance;
    }

}

Text

java 复制代码
package sigletondemo;

public class Text1 {
    public static void main(String[] args) {
        //Singleton singleton = new Singleton();
        // 实例化一个singleton对象,用private定义,在类外,无法调用
        Singleton singleton = Singleton.getInstance();//只能通过类名调用

        //饿汉式 验证
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        System.out.println(singleton1 == singleton2);

    }
}

1.4懒汉式

懒汉式:延迟加载,随用随取,

需要线程安全

优点

节省资源,只有需要的时候才开始初始化

缺点

在多线程环境下,可能会出现竞态条件,需要额外的线程安全,

代码(还需优化)

java 复制代码
package sigletondemo;
//单例模式
//懒汉式,线程不安全
public class Singleton2 {
    //无赋值
    private static  Singleton2 instance;

    private Singleton2(){}

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

Text

java 复制代码
package sigletondemo;

public class Text2 {
    public static void main(String[] args) {
        //Singleton singleton = new Singleton();
        // 实例化一个singleton对象,用private定义,在类外,无法调用
        Singleton2 singleton = Singleton2.getInstance();//只能通过类名调用

        //懒汉式 验证
        Singleton2 singleton1 = Singleton2.getInstance();
        Singleton2 singleton2 = Singleton2.getInstance();
        System.out.println(singleton1 == singleton2);
    }
}
相关推荐
Mahir088 小时前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
商业模式源码开发8 小时前
实体门店低获客成本增长案例:3 人转介绍模型 + 消费返还机制落地分析
大数据·商业模式·私域流量
RyFit9 小时前
SpringAI 常见问题及解决方案大全
java·ai
石山代码9 小时前
C++ 内存分区 堆区
java·开发语言·c++
元拓数智9 小时前
智能分析落地卡壳?先补好「数据关系+语义治理」这层技术基建
大数据·分布式·ai·spark·数据关系·语义治理
绝知此事9 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
无风听海9 小时前
C# 隐式转换深度解析
java·开发语言·c#
一只大袋鼠10 小时前
Git 进阶(二):分支管理、暂存栈、远程仓库与多人协作
java·开发语言·git
TDengine (老段)10 小时前
TDengine Tag 设计哲学与 Schema 变更机制
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
德思特11 小时前
从 Dify 配置页理解 RAG 的重要参数
java·人工智能·llm·dify·rag