@
lesismal @
yuanmomo 如果真要搞 “高并发”,当然是先初始化好一个实例,后面直接访问。显然这样做可以让后续的操作代价最低,代价最低的方法就是最适合 “高并发” 的方法。
如果初始化很耗时,那就更要提前初始化了,不然一万个请求过来了还得等这个“需要加载很多元数据,很慢” 的初始化。
> 在我看来(我能力有限),其实没有啥性能损失的,最多一点 if 比较,或者如果用枚举的形式实现,我觉得是没有什么性能损失的
和一次简单的 memory load 相比,互斥锁的代价很高。因为互斥锁需要让 CPU 处理非常复杂的缓存一致性问题。
https://en.wikipedia.org/wiki/Cache_coherence当然你可以说这个代价相比读磁盘读网络都可以忽略,那这里的 “高并发” 三个字就多余了。
用枚举来实现当然有一样的代价,不是说你自己没写互斥锁它就没有这个互斥锁,枚举本身当然需要用互斥锁来实现。
如果你觉得用枚举来实现没有性能损失,说明你没想明白这个事到底是怎么实现的,我会觉得你背了一个自己没有理解的答案。
如果你觉得加上 “高并发” 这三个字的意思是说需要使用锁来避免 lazy loading 的 race condition ,那你的理解是错的。对 lazy loading 的情况,加了锁它才是正确的代码,和高并发不相干。
如果想问怎么实现 lazy loading 的单例,其实是这个问题,
https://stackoverflow.com/questions/56724421/calling-a-method-only-once-with-multiple-threads总之这个 “高并发单例” 的问题,本身就挺有问题的。
“那么多种奇技淫巧的归纳总结,全都是屁一样的玩意”
顺便一说这个风格的 Java 用户非常多。