千家信息网

CAS非锁怎样实现单例的一个缺陷

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这期内容当中小编将会给大家带来有关CAS非锁怎样实现单例的一个缺陷,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。今天我们要说的是,无锁实现单例模式,以及这种 CAS
千家信息网最后更新 2026年11月01日CAS非锁怎样实现单例的一个缺陷

这期内容当中小编将会给大家带来有关CAS非锁怎样实现单例的一个缺陷,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

今天我们要说的是,无锁实现单例模式,以及这种 CAS 实现的单例的缺点。

传统的 7 种单例模式大致如下:

它们都是用锁来实现。但是如果在面试过程中面试官问你如何使用非锁来实现一个单例呢?

答案就是下图这种实现。

这是网上一位大牛的实现,他的这种非锁 CAS 实现的单例,挺好的。但是平时可能没有人使用,比用锁稍微复杂了一点,这也是为什么没有被列入单例模式的 7 大写法之中了。我在他的基础上,也就是他的构造方法里添加了两行代码。

我主要是想看看它到底是实例化了几次。加上这两行代码,可以方便我观察控制台,和统计实例化的总次数。

然后,我的测试代码如下:

关于 CountDownLatch 有不会的,可以看我的《CountDownLatch 压测教程》一文。

我这里主要是想压测一下,非锁 CAS 单例模式是否会创建多次对象。

运行上面的 main 方法,我截图了一下最终结果。

CAS 以原子方式更新内存中相应的值,从而保证了多线程环境下共享变量更新操作的同步。的确,这种方式可以保证每次调用getInstance() 方法得到的一定是同一个实例。因此,从功能实现的角度来看,这种做法达到了预期的目的。但是,经过分析和测试,却发现这种方式有一些预期之外的弊病:可能会创建不止一个对象。

CAS 本身的操作的确是原子方式,但是包装 CAS 指令的方法并非是全程同步的,当然,在包含 CAS 指令的方法开始调用之前,参数计算过程中更不是互斥执行的!当一个线程测试 instance.get() == null 得到 true 之后,往下它就一定会调用 new Singleton()。因为,这并不是 CAS 方法的一部分,而是它的参数。在调用一个方法之前,需要先将其参数压入栈,当然,需要先计算参数表达式,因此,产生如上结果也就不难预料了。

CAS 与锁的区别在于,它是非阻塞的,也就是说,它不会去等待一个条件,而是一定会去执行,结果要么成功,要么失败。它的操作时间是可预期的。如果我们的目的是一定要成功执行 CAS,那就需要不断循环执行直至成功,同时,建立在成功预期之上大量的准备工作是值得的,但是,如果我们不希望操作一定成功,那为成功操作而做的准备工作就浪费掉了。

上述就是小编为大家分享的CAS非锁怎样实现单例的一个缺陷了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

方法 成功 参数 方式 模式 代码 实例 结果 分析 测试 缺陷 也就是 会创 内容 原子 对象 就是 指令 目的 线程 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广东猪兼强互联网科技有限公司 互联网科技工作委员会 互联网络科技有限公司 互联网科技排名 九亚互联网科技 科技创新互联网企业 互联网科技公司的市场部门 西藏七维空间互联网科技有限公司 互联网系的金融科技公司 崇明区互联网教育科技诚信经营 杭州壁岐互联网科技有限公司 华夏恒生互联网科技013171 华中科技大学互联网的牛人 上海京穆互联网科技有限公司 每天都有哪些好的互联网科技 中国互联网有什么科技 陕西云淼互联网科技公司 宁波跨境商互联网科技有限公司 陕西九四连强互联网科技有限公司 银川新华互联网科技学校是国营吗 广州淘业互联网络科技 互联网科技作文 米客互联网科技 互联网科技有哪些公司 彤创互联网科技有限公司 烟台灵鸽互联网科技有限公司 宇信科技在杭州互联网排第几 广州互联网高科技取餐柜 安徽零酒互联网科技有限公司 广州全民伙伴互联网科技有限公司
0