IntelliJ IDEA 2022.2 的第三个 EAP 版本已经发布,此版本带来用于更改所有编辑器字体大小的快捷方式、使用 IntelliJ Profiler 更新快照记录、支持 Groovy 集成查询等新功能。
用户体验
更改全局字体大小的键盘快捷键
该版本引入可更改所有编辑器字体大小的键盘快捷键, 要增加字体大小,请按 ⌃⇧. /Alt+Shift+. ;要减小字体,请按 ⌃⇧,/Alt+Shift+Comma。
Groovy
支持 GINQ
添加了对 Groovy 集成查询 (GINQ) 的支持,IDE 现在为 Groovy 4 的 GINQ 功能提供语法突出显示、代码完成和检查。
IntelliJ Profiler
升级了 IntelliJ Profiler,让收集快照变得更加容易。开始分析时,CPU 和堆内存实时图表与控制台并排显示。
编辑器
控制自动插入括号的新设置
该版本添加了一个选项,可以设置 IDE 是否在代码补全时自动插入括号,该设置以前仅适用于 JavaScript,现在也可用于其他语言。
以上是新版 EAP 带来的关键更新,有关最新改进的完整列表,请查看发行说明。
租户模式 描述 优点 缺点 NONE (非租户模式) 没有租户 简单、适合独立系统 缺少租户系统的优点 COLUMN (字段模式) 租户共用一个数据库,在业务表中增加字段来区分 简单、不复杂、开发无感知 数据隔离性差、安全性差、数据备份和恢复困难、 SCHEMA (独立数据库) 每个租户独立一个 数据库 (schema),执行 sql 时,动态在表名前增加 schema 简单、开发无感知、数据隔离性好 配置文件中必须配置数据库的 root 账号、不支持复杂 sql 和 sql 嵌套自定义函数 DATASOURCE (独立数据源) 每个租户独立一个数据源,执行代码时,动态切换数据源 可独立部署数据库,数据隔离性好、扩展性高、故障影响小 相对复杂、开发需要注意切换数据源时的事务问题、需要较多的数据库 SCHEMA_COLUMN (独立数据库 + 字段模式) 每个租户独立一个 数据库,执行代码时,先动态切换数据源,在动态拼接 子租户 id 进行二次隔离 简单、开发无感知、数据隔离性好、支持大租户小门店形式 配置文件中必须配置数据库的 root 账号、不支持复杂 sql 和 sql 嵌套自定义函数 DATASOURCE_COLUMN (独立数据源 + 字段模式) 每个租户独立一个 数据库 (数据源),执行代码时,动态切换数据源,在动态拼接 子租户 id 二次隔离 可独立部署数据库,数据隔离性好、扩展性高、故障影响小、支持大租户小门店形式 相对复杂、开发需要注意切换数据源时的事务问题、需要较多的数据库 技术 版本 说明 Spring Boot 3.0.0-SNAPSHOT 容器 + MVC 框架 MyBatis 3.5.9 ORM 框架 MyBatis-Plus 3.5.1 MyBatis 增强工具 JJWT 0.11.5 JWT 登录支持 Lombok 1.18.24 简化对象封装工具 Caffeine 3.1.0 本地缓存支持 Redis 7.0 分布式缓存支持 MySQL 8.0 数据库服务 ShardingSphere-JDBC 5.1.1 数据库分库分表支持 Elasticsearch 8.2.0 搜索引擎服务 RabbitMQ 3.10.2 开源消息中间件 XXL-JOB 2.3.1 分布式任务调度平台 Sentinel 1.8.4 流量控制组件 Undertow 2.2.17.Final Java 开发的高性能 Web 服务器 Docker – 应用容器引擎 Jenkins – 自动化部署工具 Sonarqube – 代码质量控制 版本名称 版本说明 版本地址 GoFrame+Layui 混编版 采用 GoFrame、Layui 等框架研发 https://gitee.com/easygoadmin/EasyGoAdmin_GoFrame_Layui Beego+Layui 混编版 采用 Beego、Layui 等框架研发 https://gitee.com/easygoadmin/EasyGoAdmin_Beego_Layui Gin+Layui 混编版 采用 Gin、Layui 等框架研发 https://gitee.com/easygoadmin/EasyGoAdmin_Gin_Layui Iris+Layui 混编版 采用 Iris、Layui 等框架研发 https://gitee.com/easygoadmin/EasyGoAdmin_Iris_Layui GoFrame+EleVue 前后端分离版 采用 GoFrame、Vue、ElementUI 等框架研发前后端分离版本 https://gitee.com/easygoadmin/EasyGoAdmin_GoFrame_EleVue Beego+EleVue 前后端分离版 采用 Beego、Vue、ElementUI 等框架研发前后端分离版本 https://gitee.com/easygoadmin/EasyGoAdmin_Beego_EleVue Gin+EleVue 前后端分离版 采用 Gin、Vue、ElementUI 等框架研发前后端分离版本 https://gitee.com/easygoadmin/EasyGoAdmin_Gin_EleVue Iris+EleVue 前后端分离版 采用 Iris、Vue、ElementUI 等框架研发前后端分离版本 https://gitee.com/easygoadmin/EasyGoAdmin_Iris_EleVue GoFrame+AntdVue 前后端分离版 采用 GoFrame、Vue、AntDesign 等框架研发前后端分离版本 https://gitee.com/easygoadmin/EasyGoAdmin_GoFrame_AntdVue Beego+AntdVue 前后端分离版 采用 Beego、Vue、AntDesign 等框架研发前后端分离版本 https://gitee.com/easygoadmin/EasyGoAdmin_Beego_AntdVue Gin+AntdVue 前后端分离版 采用 Gin、Vue、AntDesign 等框架研发前后端分离版本 https://gitee.com/easygoadmin/EasyGoAdmin_Gin_AntdVue Iris+AntdVue 前后端分离版 采用 Iris、Vue、AntDesign 等框架研发前后端分离版本 https://gitee.com/easygoadmin/EasyGoAdmin_Iris_AntdVue
之前我们已经看过了 Golang 常见设计模式中的装饰和选项模式,今天要看的是 Golang 设计模式里最简单的单例模式。单例模式的作用是确保无论对象被实例化多少次,全局都只有一个实例存在。根据这一特性,我们可以将其应用到全局唯一性配置、数据库连接对象、文件访问对象等。Go 语言实现单例模式的方法有很多种,下面我们就一起来看一下。
饿汉式
饿汉式实现单例模式非常简单,直接看代码:
singleton 包在被导入时会自动初始化 instance 实例,使用时通过调用 singleton.GetSingleton() 函数即可获得 singleton 这个结构体的单例对象。
这种方式的单例对象是在包加载时立即被创建,所以这个方式叫作饿汉式。与之对应的另一种实现方式叫作懒汉式,懒汉式模式下实例会在第一次被使用时被创建。
需要注意的是,尽管饿汉式实现单例模式的方式简单,但大多数情况下并不推荐。因为如果单例实例化时初始化内容过多,会造成程序加载用时较长。
懒汉式
接下来我们再来看下如何通过懒汉式实现单例模式:
相较于饿汉式的实现,懒汉式将实例化 singleton 结构体部分的代码移到了 GetSingleton() 函数内部。这样能够将对象实例化的步骤延迟到 GetSingleton() 第一次被调用时。
不过通过 instance == nil 的判断来实现单例并不十分可靠,如果有多个 goroutine 同时调用 GetSingleton() 就无法保证并发安全。
支持并发的单例
如果你使用 Go 语言写过并发编程,应该很快能想到该如何解决懒汉式单例模式并发安全问题,比如像下面这样:
上面代码的修改是通过加锁机制,即在 GetSingleton() 函数最开始加了如下两行代码:
加锁的机制可以有效保证这个实现单例模式的函数是并发安全的。
不过使用了锁机制也带来了一些问题,这让每次调用 GetSingleton() 时程序都会进行加锁、解锁的步骤,从而导致程序性能的下降。
双重锁定
加锁会导致程序性能下降,但又不用锁又无法保证程序的并发安全。为了解决这个问题有人提出了双重锁定(Double-Check Locking)的方案:
通过上面的可以看到,所谓双重锁定实际上就是在程序加锁前又加了一层 instance == nil 判断,通过这种方式来兼顾性能和安全两个方面。不过这让代码看起来有些奇怪,外层已经判断了 instance == nil,但是加锁后又进行了第二次 instance == nil 判断。
其实外层的 instance == nil 判断是为了提高程序的执行效率,免去原来每次调用 GetSingleton() 都上锁的操作,将加锁的粒度更加精细化。简单说就是如果 instance 已经存在,则无需进入 if 逻辑,程序直接返回 instance 即可。而内层的 instance == nil 判断则考虑了并发安全,考虑到万一在极端情况下,多个 goroutine 同时走到了加锁这一步,内层判断会在这里起到作用。
Gopher 惯用方案
虽然双重锁定机制兼顾和性能和并发安全,但显然代码有些丑陋,不符合广大 Gopher 的期待。好在 Go 语言在 sync 包中提供了 Once 机制能够帮助我们写出更加优雅的代码:
Once 是一个结构体,在执行 Do 方法的内部通过 atomic 操作和加锁机制来保证并发安全,且 once.Do 能够保证多个 goroutine 同时执行时 &singleton{} 只被创建一次。
其实 Once 并不神秘,其内部实现跟上面使用的双重锁定机制非常类似,只不过把 instance == nilIdea激活2022.2.3 换成了 atomic 操作,感兴趣的同学可以查看下其对应源码。
总结
以上就是 Go 语言中实现单例模式的 Idea激活2022.2.3几种常用套路,经过对比可以得出结论,最推荐的方式是使用 once.Do 来实现,sync.Once 包帮我们隐藏了部分细节,却可以让代码可读性得到很大提升。
推荐阅读
Golang 常见设计模式之装饰模式
Golang 常见设计模式之选项模式
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/176170.html