volatile 修饰符在双检锁单例模式中的作用
在实现一个双检锁单例的时候,IDEA 提示我要给 INSTANCE
实例加上 volatile
修饰符。当时并不明白为啥,所以选择相信 IDE。但是还是那句话,不能知其然不知其所以然啊,自己写的代码,不能自己心里没底不是。于是乎我一顿网上冲浪,终于整明白了为啥双检单例必须要用 volatile
修饰符。
在实现一个双检锁单例的时候,IDEA 提示我要给 INSTANCE
实例加上 volatile
修饰符。当时并不明白为啥,所以选择相信 IDE。但是还是那句话,不能知其然不知其所以然啊,自己写的代码,不能自己心里没底不是。于是乎我一顿网上冲浪,终于整明白了为啥双检单例必须要用 volatile
修饰符。
突然想起来小时候玩过的一个电子宠物游戏《梦幻电子宠物》。
主窗口 | 宠物状态 | 关于 |
---|---|---|
![]() |
![]() |
![]() |
这个小游戏的存档机制很有意思,是在 C 盘根目录下创建一个 ini 文件,记录宠物的出生时间和各项指标,然后它会根据这个时间来计算宠物的状态。也就是说,即使你把游戏关掉,宠物也不会停止成长。所以玩家就必须经常打开游戏照顾这个宠物,不然很有可能下次打开的时候,宠物就已经变成一个墓碑了……
这个小游戏我上传到蓝奏云了,有兴趣的可以去下载来玩。不过因为 64 位的 Windows 已经不支持 16 位应用,所以你需要一个老版本系统的虚拟机,或者用 otvdm
来运行。
地址:https://boris1993.lanzouj.com/b03queu3c
密码:15l3
P.S.:在找原版的时候,我注意到关于页面里 “碧晓拱籍 设计”,以为这是原作者的名字,于是就拿它一顿找啊,但一无所获。突然灵光一现,这会不会是…… 乱码?鬼使神差把这四个字按照 GBK
编码保存,然后再用 SHIFT-JIS
编码打开,得到一串片假名アフマ�ケーショ
,定睛一看这不就是 application
的日语アプリケション
嘛,虽然里面又掺了个乱码……
乱翻收藏夹的时候发现我还有个免费的 Grafana Cloud,遂想着把我这些自建的东西都用它监控起来,反正不用白不用。那么第一个就拿我的 RouterOS 软路由开刀吧。
前两天赶上阿里云搞活动,薅了一个 99 一年的 ECS。因为要接进咱的探针,就得跟我的服务器组个网。之前都是用 NAS 上装的 wgeasy
,这回想想,咱的 RouterOS 也有 Wireguard,那干脆吃个螃蟹,看看能不能直接在软路由上组,慢慢的逐步把 wgeasy
淘汰掉,顺便正经的学学 Wireguard 组网。
这两天又捡起来了之前开的一个老坑,继续完成 X 岛揭示板的 iOS 客户端,而且刚刚完成了从 JSON 初始化版面列表的功能。
这部分感觉最难的还是上手 Alamofire
,因为它返回结果不像我平时做 Web 开发那样通过方法返回(也有可能是我没学到位),而是要把反序列化得到的对象传给一个回调方法。而这个思路的差异也导致我刚开始学的时候非常的痛苦,因为怎么也找不到我想要的那种返回方式。
我相信应该不止我一个人会遇到这种情况,所以打算在这里把完整的实现过程记录在这里,并希望后面有类似情况的同志能因为这篇文章而少掉几根头发。
这两天给我的窗边岛项目实现了 X 岛揭示板网页中的防剧透
功能。这个功能本质上就是,当鼠标悬浮在文字上时显示原本的内容,当鼠标移出文字时则用黑块代替。即
X 岛揭示板 | 窗边岛 |
---|---|
![]() |
![]() |
虽然说起来很简单,但是好像网上并没有针对这个需求有什么相关的内容,所以在这里记录下我的实现,权当抛砖引玉。
之前我一直把博客的图片放在个人的 OneDrive 上,然后用嵌入功能得到外链放在博客里。但是考虑到国内访问 OneDrive 的延迟还是偏高,以及不折腾不舒服的心理作祟,于是乎在三月份的时候,我把博客的图片从 OneDrive 迁到了 Backblaze 对象存储。
换成自己用 RouterOS 拨号之后,经常发现有的图片加载不出来,网上一顿冲浪之后发现可能是在 RouterOS 中没有正确配置 MTU 及 MSS,导致部分包被丢弃,也就是传说中的 PMTU 黑洞。
昨天收到 Vercel 发的报警邮件,说我自己部署的分析平台 umami
部署失败。检查之后发现是 umami
有个大版本升级,而升级脚本失败导致新版本部署失败了。那既然报错了,就修呗。
虽然不是什么复杂的问题,但还是记录一下好了,也当是水一篇文。
依旧是面试查漏补缺。这次是 MySQL 的最左匹配原则。
废话不多说,直接看 MySQL 官方文档给出的例子。
有这么一个表:
1 | CREATE TABLE test ( |
可以看出,表里面有一个联合索引 (last_name, first_name)
。那么,查询的时候,这些语句就可以成功走索引:
1 | SELECT * FROM test WHERE last_name = 'Doe'; |
而这些查询就无法使用这个索引:
1 | SELECT * FROM test WHERE first_name = 'John'; |
也就是说,上面例子中的 last_name
列就是索引的最左前缀,如果要在查询中使用这个索引,那么条件中必须包含 last_name
,或者同时包含 last_name
和 first_name
。
MySQL can use multiple-column indexes for queries that test all the columns in the index, or queries that test just the first column, the first two columns, the first three columns, and so on. If you specify the columns in the right order in the index definition, a single composite index can speed up several kinds of queries on the same table.