Java并发编程指南:深入理解无锁与CAS底层原理
作为乐观派的代表,CAS操作总是怀揣着必胜的信念。当多个线程同时对同一个变量执行CAS操作时,只会有一个胜出并成功更新,其余的都将以失败告终。不过,失败的线程并不会被挂起,它只是被告知操作失败,并允许再次尝试。当然,失败的线程也可以选择放弃操作,这一点从图中同样可以观察到。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
1. 无锁的概念
提起无锁(Lock-Free)概念,乐观主义者与悲观主义者总是被相提并论。在乐观主义者看来,事物总是倾向于往好的方向发展,认为糟糕情况发生的概率极低,因此他们可以无所顾忌地行动。然而,对于悲观主义者而言,他们总是担心如果发展趋势没有得到及时控制,未来将无法挽回,即使这种无法挽回的情况几乎不可能发生。
这两派观点被映射到并发编程中,就如同加锁(Locking)和无锁(Lock-Free)这两种策略。具体来说,加锁是一种悲观的策略,而无锁则是一种乐观的策略。
因为对于使用加锁的并发程序而言,它总是默认每次访问共享资源时必然会发生冲突,因此必须对每个数据操作实施加锁策略。
而无锁策略则总是假设在访问共享资源时没有冲突,线程可以在不加锁或等待的情况下继续运行。一旦检测到冲突,无锁策略会使用一种称为CAS的技术来确保线程执行的安全性,而这种CAS技术正是实现无锁策略的关键。
接下来,让我们深入探讨CAS技术的奥妙。
2. CAS
2.1 什么是CAS
CAS的全称是Compare And Swap,即比较并交换。其算法的核心思想如下:

它包含三个参数:
V 代表要更新的变量 E 代表预期值 N 代表新值如果V的值等于E的值,则将V的值设置为N。如果V和E的值不同,则表示另一个线程已经进行了更新,当前线程什么也不做。通俗的理解是,CAS操作需要我们提供一个预期值。当预期值与当前线程手中的变量值相同时,说明没有其他线程修改过该值,当前线程可以进行修改,即执行CAS操作。但如果预期值与当前值不匹配,则说明该值已被其他线程修改。此时,不执行更新操作,但你可以选择重新读取变量并尝试再次修改,或者也可以放弃操作。
由于CAS操作属于乐观派,它总是相信自己能成功完成操作。当多个线程同时对同一个变量使用CAS操作时,只有一个会胜出并更新成功,其余的都将会失败。然而,失败的线程不会被挂起,只是被告知失败并允许再次尝试。当然,也允许失败的线程放弃操作,这一点从图中也可以看出。
基于这样的原理,即使在CAS操作中没有锁,它仍然能感知到其他线程的操作对共享资源的影响,并执行相应的处理措施。同时,从这一点也可以看出,由于无锁操作中没有锁,因此不可能出现死锁情况,也就是说,无锁操作天生免疫死锁。
2.2 CPU对CAS的指令支持
也许我们会有这样的疑问。假设有多个线程执行CAS操作,且CAS中有很多步骤。有没有可能在判断V和E相同之后,正要赋值的时候,线程被切换了,导致数值被改变,从而引发数据不一致?答案是肯定的否定,因为CAS是一条系统原语。原语属于操作系统术语的范畴。它由若干条指令组成,是用于完成特定功能的过程。而且,原语的执行必须是连续的,在执行过程中不允许被中断。也就是说,CAS是一条CPU的原子指令,不会导致所谓的数据不一致问题。
热门专题
热门推荐
PChome 3月31日消息,OPPO官微官宣,OPPOx哈苏影像新品联合发布会将于4月21日晚19:00在成都举办,Find X9s Pro、Find X9 Ultra等新品将至。据了解,OPPO
小红书网页版登录入口为https: www xiaohongshu com explore,支持扫码、手机号验证码及微信三种登录方式,首页默认瀑布流展示热门笔记,具备多维度内容检
两年前,谢添天发现自己的声音被一款APP“盗”走——用户输入文本,即可用他的音色生成以假乱真的AI声音。维权半年,因举证难度太高,最终以和解和对方致歉了结。两年后,一场大规模的联合发声,将AI盗声侵
来源:央广网3月28日至29日,以“发挥主流媒体引领力 激发多元主体创造力——共创繁荣网络内容生态”为主题的2026中国网络媒体论坛在河南郑州举行。网络媒体因技术而诞生,凭创新而繁荣。面对新一轮科技
当大语言模型与AgenticAI(智能体)从试验场进入企业级生产环境,SaaS行业的底层价值逻辑正面临系统性重估。这一轮变革的核心,正指向“AI CRM 2 0”的全面到来——它不再是传统CRM的功





