切换导航
{{systemName}}
{{ info.Title }}
{{info.Title}}
{{ menu.Title }}
{{menu.Title}}
登录
|
退出
搜索
单例模式的应用场景
作者:ych
### 定义 单例模式是最简单的设计模式之一,属于创建型模式,它提供了一种创建对象的方式,确保只有单个对象被创建。 这个设计模式主要目的是想在整个系统中只能出现类的一个实例,即一个类只有一个对象。 单例模式能够实现懒加载,能够在使用实例的时候才去创建实例。开发工具类库中的很多工具类都应用了单例模式,比例线程池、缓存、日志对象等,它们都只需要创建一个对象。 如果创建多份实例,可能会带来不可预知的问题,比如资源的浪费、结果处理不一致等问题。单例模式的解决的痛点就是节约资源,节省时间从两个方面看。 1.由于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级的对象而言,是很重要的. 2.因为不需要频繁创建对象,我们的GC压力也减轻了,而在GC中会有STW(stop the world),从这一方面也节约了GC的时间 单例模式的缺点:简单的单例模式设计开发都比较简单,但是复杂的单例模式需要考虑线程安全等并发问题,引入了部分复杂度。 饿汉式|线程安全|并发性能好|可以延迟加载|序列化/反序列化安全|能抵御反射攻击 -|-|-|-|-|- 饿汉式|Y|Y||| 懒汉式|不加锁||Y|Y| 加锁的|Y||Y|| DCL|Y|Y|Y|| 静态内部类|Y|Y|Y|| 枚举|Y|Y||Y|Y ### 设计 设计单例模式的时候一般需要考虑几种因素: 1.线程安全 2.延迟加载 3.代码安全:如防止序列化攻击,防止反射攻击(防止反射进行私有方法调用) 4.性能因素:饿汉,懒汉(线程安全,线程非安全),双重检查(DCL)(重点),内部类,以及枚举(重点)。
相关推荐
golang 中解析 tag 是怎么实现的?反射原理是什么?(中高级肯定会问,比较难,需要自己多去总结)
.Net面试题
golang map 使用注意的点,是否并发安全?
uint 类型溢出问题
Golang中defer和return执行的先后顺序
讲讲 Go 的 select 底层数据结构和一些特性?(难点,没有项目经常可能说不清,面试一般会问你项目中怎么使用select)
golang中两个变量值的4种交换方式
.net 10万+大数据处理方式、应用场景
调用函数传入结构体时,应该传值还是指针? (Golang 都是传值)
为 sync.WaitGroup 中Wait函数支持 WaitTimeout 功能.
Golang判断slice是否相等
讲讲 Go 的 defer 底层数据结构和一些特性?
Golang空结构体 struct{} 的使用
go defer,多个 defer 的顺序,defer 在什么时机会修改返回值?
http超文本传输协议
序列化协议
Golang 单引号,双引号,反引号的区别?
Golang表示枚举类型的详细讲解
昨天那个在for循环里append元素的同事,今天还在么?
什么是死锁?死锁产生的原因?如何避免死锁?
golang并发题目测试
交替打印数字和字母
golang面试题
for range 的时候它的地址会发生变化么?
B+树为什么快
数组和切片的区别 (基本必问)
实现阻塞读且并发安全的map
机器人坐标问题
复利计算 递归/非递归
在 golang 协程和channel配合使用
MySQL索引原理
写出以下逻辑,要求每秒钟调用一次proc并保证程序不退出?
讲讲 Go 的 slice 底层数据结构和一些特性?
C#二叉树查找法
高并发下的锁与map的读写
HTTP协议-HTTP3
Redis的优点
详解C#中SqlParameter的作用与用法
常见语法题目2
判断两个给定的字符串排序后是否一致
ElasticSearch使用场景
字符串替换问题
golang 中 make 和 new 的区别?(基本必问)
常见语法题目1
七道语法找错题目
web技术演化
判断字符串中字符是否全都不同
redis缓存穿透、缓存击穿、缓存雪崩原因+解决方案
基本数据结构和算法
消息队列使用的场景介绍
操作系统基本原理
翻转字符串
redis在项目中的使用
TiDB使用场景
面向对象
.net插入日志数据纠错
TCP三次握手和四次挥手
评论区
先去登录
版权所有:机遇屋在线 Copyright © 2021-2025 jiyuwu Co., Ltd.
鲁ICP备16042261号-1