单例模式~

news/2024/10/18 12:21:09/

概要

确保一个类只有一个实例,并提供一个全局访问点来访问该实例。

主要解决的问题

频繁创建和销毁全局使用的实例,减少开销。

解决思路

如果有该实例就返回,没有就创建。

应用场景

数据库连接池、线程池、spring中service等

几种实现方式

懒汉式 (多线程不安全)

实现简单

public class Singleton {private static Singleton instance;private Singleton(){}private static Singleton getinstance(){if(instance==null){instance = new Singleton();}return instance;}
}

懒汉式(多线程安全)

优点:第一次调用才初始化,避免内存浪费。
缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。

public class Singleton {private static Singleton instance;private Singleton(){}private static synchronized Singleton getinstance(){if(instance==null){instance = new Singleton();}return instance;}
}

饿汉式(多线程安全)

优点:没有加锁,执行效率会提高。
缺点:类加载时就初始化,浪费内存。

public class Singleton {private static Singleton singleton = new Singleton();private Singleton(){}public static Singleton getInstance(){return singleton;}
}

双重检查(线程安全)

public class Singleton {private static volatile Singleton singleton;private Singleton(){}public static Singleton getInstance(){if (singleton==null){synchronized (Singleton.class){if (singleton==null){singleton = new Singleton();}}}return singleton;}
}

内部静态类(线程安全)

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

枚举 

public enum SingletonTwo {INSTANCE;public void whateverMethod() {}
}

http://www.ppmy.cn/news/1476829.html

相关文章

vue中怎么改变状态值?

在Vue中,状态值通常指的是组件的data函数返回的对象中的属性,或者是Vuex状态管理库中的状态。以下是在Vue中改变状态值的几种常见方法: 1. 直接在组件内部改变状态值 在Vue组件中,你可以直接在methods中改变data函数返回的对象中…

【系统规划与管理师重点及记忆口诀】第五章IT服务部署实施

【系统规划与管理师重点及记忆口诀】第五章IT服务部署实施 一 概述 1 IT 服务部署目标 总目标:服务的标准化和规范化 进一步分解为如下7个方面: 口诀: 发质丰满先观察 古代帝王选妃部署服务,有一套标准化和规范化的操作&am…

RedisTemplate 查看key的过期时间

在使用Spring Data Redis时,RedisTemplate 提供了查看键的过期时间的方法。可以使用 getExpire 方法来获取指定键的剩余生存时间(TTL)。 示例代码 以下是如何使用 RedisTemplate 查看键的过期时间的示例代码: 1. 配置 RedisTem…

酒店管理系统(C语言)

系统分析 本系统分为以下6大模块:顾客登记模块、查询顾客信息模块、查询空房间模块、预订房间模块、退订房间模块、保存并退出模块,如下图所示。 1. 顾客结构体 2. 主菜单的设计及实现 3. 登记顾客模块的实现 4. 查询顾客信息功能的实现 5. 查询空房间功…

在RK3568上如何烧录MAC?

这里我们用RKDevInfoWriteTool 1.1.4版本 下载地址:https://pan.baidu.com/s/1Y5uNhkyn7D_CjdT98GrlWA?pwdhm30 提 取 码:hm30 烧录过程: 1. 解压RKDevInfoWriteTool_Setup_V1.4_210527.7z 进入解压目录,双击运行RKDevInfo…

Redis之List列表

目录 一.列表讲解 二.列表命令 三.内部编码 四.应用场景 Redis的学习专栏:http://t.csdnimg.cn/a8cvV 一.列表讲解 列表类型是用来存储多个有序的字符串,如下所示,a、b、c、d、e五个元素从左到右组成了一个有序的列表,列表中的…

笔记:现代卷积神经网络之VGG

本文为李沐老师《动手学深度学习》笔记小结,用于个人复习并记录学习历程,适用于初学者 神经网络架构设计的模块化 然AlexNet证明深层神经网络卓有成效,但它没有提供一个通用的模板来指导后续的研究人员设计新的网络。 在下面的几个章节中&a…

iOS ------ 编译链接

编译流程分析 编译可以分为四步: 预处理(Prepressing)编译(Compilation)汇编 (Assembly)链接(Linking) 预编译(Prepressing) 过程是源文件main.c和相关头文件被&#…