单例模式

简介: 什么是单例模式?在一个项目中,单例模式确保某一个类只能有一个实例,这个类称为单例类。怎样确保某个类只能有一个实例,通常调用方法有两种方式: 创建类的一个对象,即new出一个对象,用该对象去调用类中方法; 使用类名直接调用类中方法,格式“类名.方法名()”想要类只有一个实例,必不能随意通过new出对象,禁止new对象就只能私有化构造方法,采用“类名.方法名()”这种方式获取方法。

什么是单例模式?在一个项目中,单例模式确保某一个类只能有一个实例,这个类称为单例类。
怎样确保某个类只能有一个实例,通常调用方法有两种方式:

  1. 创建类的一个对象,即new出一个对象,用该对象去调用类中方法;
  2. 使用类名直接调用类中方法,格式“类名.方法名()”
    想要类只有一个实例,必不能随意通过new出对象,禁止new对象就只能私有化构造方法,采用“类名.方法名()”这种方式获取方法。通过类名对用方法,此方法是属于类的方法,由于类的加载顺序限定,此方法必须是静态(static)的,且方法里的属性也必须是静态的。

单例核心三要素:

  1. 构造方法私有化
  2. 提供静态(static)的得到类对象的方法
  3. 类属性设为static

单例模式根据对象的创建时间不同,有分为EagerSingleton和LazySingleton。
EagerSingleton方法:

public class EagerSingleton {
    /** 静态方法访问静态成员变量*/
    private static EagerSingleton instance = new EagerSingleton();
    /** 私有构造方法,防止被实例化 */
    private EagerSingleton(){
    }
    /** 提供调用的方法 */
    public static EagerSingleton getInstance(){
        return instance;
    }
}

EagerSingleton方法缺点是该类加载的时候就会直接new 一个静态对象,当系统中单例类较多时,会使得启动速度变慢。
LazySingleton方法:

public class LazySingleton {
    //非线程安全
    private static LazySingleton instance = null;
    private LazySingleton(){
    }
    public static LazySingleton getInstance1(){
        if(instance == null){
            instance = new LazySingleton();
        }
        return instance;
    }
}

提供双重锁写法,保证线程安全:

public class DoubleCheckLock {

    private volatile static DoubleCheckLock instance = null;

    private DoubleCheckLock(){
    }

    public static DoubleCheckLock getInstance(){
        if(instance == null){
            synchronized (DoubleCheckLock.class) {
                if(instance == null)
                    instance = new DoubleCheckLock() ;
            }
        }
        return instance;
    }
}

“双重检查加锁”机制是当每次执行getInstance方法时先不同步,先检查instance是否存在,如果不存在才进行加锁,这是第一重检查;进入同步块synchronized 方法后,再次检查实例是否存在,如果不存在就创建实例instance,这是第二重检查。DoubleCheckLock 机制使用关键字volatile,被volatile修饰的变量值不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而确保多个线程能正确的操作该变量。

参考:
1.https://www.cnblogs.com/java-my-life/archive/2012/03/31/2425631.html

目录
相关文章
|
C语言 Windows
使用CMake调用Makefile 项目
使用CMake调用Makefile 项目
583 0
|
存储 Linux Shell
linux基本功之历史记录history命令实战
linux基本功之历史记录history命令实战
1300 0
linux基本功之历史记录history命令实战
|
5月前
|
人工智能 数据挖掘 Serverless
花一周搭 AI Agent 没跑通,同事 3 分钟上线了——我把他的方案扒了个底朝天
本文实操拆解阿里云AgentRun+百炼一站式搭建AI Agent方案:3分钟创建、10分钟接入、当天上线。告别GPU租赁、框架选型、K8s运维、数据库搭建等自建痛点,Serverless全托管计算、弹性伸缩、NAS持久化、开箱即用工具链,月成本仅一杯咖啡钱。
|
5月前
|
人工智能 边缘计算 自然语言处理
智能体来了,AI从“会聊天”到“能干活”,开启全民智能助手时代
当你说“帮我订一家周末的亲子餐厅”,传统AI只会罗列餐厅信息;而智能体会自动查档期、对比评价、预约座位并同步到日历——无需你反复操作,全程自主搞定。 2026年,AI智能体(Agent)不再是实验室概念,而是正在重塑工作与生活的核心力量。它标志着人工智能从“被动问答”的大模型时代,迈入“主动执行”的智能体时代。今天,我们用一篇文章讲透:智能体是什么、能做什么、将如何改变我们的世界。
|
11月前
|
传感器 JavaScript 物联网
3.7V升压5V芯片深度剖析,PW5100/PW5300A/PW6276,选型无忧
3.7V升压5V芯片深度剖析,PW5100/PW5300A/PW6276,选型无忧
|
12月前
|
机器学习/深度学习 人工智能 边缘计算
# AI商业落地专家TOP榜:极睿科技武彬的AIGC电商应用全解析
2025年AI深度融入商业,优质知识传播成关键。本文基于学术、实战、内容与影响力四大维度,精选十位持续输出高质量内容的AI领域博主,涵盖计算机视觉、NLP、大模型、边缘计算与AI产品等方向,助力从业者精准获取专业资源,提升技术落地能力。
975 0
|
5月前
|
数据采集 JSON API
企业级实战:淘宝铺货核心API接口说明(含JSON返回)
淘宝铺货核心依赖两类API,分别对应「获取货源商品数据」和「自有店铺上架商品」,适配跨店铺货、多平台同步、批量上架等企业场景,全程合规调用,避免爬虫风险。
|
11月前
|
人工智能 自然语言处理 监控
AI Ping: 一站式大模型服务评测与API调用平台技术解析
在当前大模型应用爆发式增长的背景下,开发者面临着一个共同的痛点:如何高效、低成本地调用大模型服务? 本文将深入解析AI Ping如何通过其vibe coding工具链实现"零成本"接入三大主流免费模型,帮助开发者在日常开发中显著降低AI使用成本。
1049 1
AI Ping: 一站式大模型服务评测与API调用平台技术解析
|
算法 测试技术 调度
【调度算法】DTLZ问题家族
【调度算法】DTLZ问题家族
854 1
|
存储 人工智能 关系型数据库
5倍性能提升,阿里云AnalyticDB PostgreSQL版新一代实时智能引擎重磅发布
2023 云栖大会上,AnalyticDB for PostgreSQL新一代实时智能引擎重磅发布,全自研计算和行列混存引擎较比开源Greenplum有5倍以上性能提升。AnalyticDB for PostgreSQL与通义大模型家族深度集成,推出一站式AIGC解决方案。阿里云新发布的行业模型及“百炼”平台,采用AnalyticDB for PostgreSQL作为内置向量检索引擎,性能较开源增强了2~5倍。大会上来自厦门国际银行、三七互娱等知名企业代表和瑶池数据库团队产品及技术资深专家们结合真实场景实践,深入分享了最新的技术进展和解析。
5倍性能提升,阿里云AnalyticDB PostgreSQL版新一代实时智能引擎重磅发布