浅谈:什么是乐观锁CAS 小伙伴们还记得吗上一次我们以 Java 语言为例通过特性将锁分组归类主要讲了悲观锁和乐观锁我们以一张图来回顾一下上节的两个锁加强知识点理解和巩固。如上图所示我们可以发现悲观锁基本都是先加锁之后再操作同步资源而乐观锁直接就去操作同步资源。那么为什么乐观锁能够做到事先不加锁也可以正确的实现线程并发呢我们这一节介绍乐观锁的主要实现方式 “CAS” 的技术原理。什么是「CAS」CAS 全称 Compare And Swap比较与交换是一种用于在多线程环境下实现同步功能的机制。在不使用锁没有线程被阻塞的情况下实现多线程之间的变量同步。java.util.concurrent 包中的原子类就是通过 CAS 来实现了乐观锁。CAS 的底层 Unsafe 类为何能通过 Unsafe.getUnsafe() 方法能获得 Unsafe 类的实例其实因为 AtomicInteger 类也在 rt.jar 包下面的所以 AtomicInteger 类就是通过 Bootstrap 根类加载器进行加载的 Unsafe 类具体实现就得看 hotspot 源码 unsafe.cppC 的代码就不在具体在这里分析感兴趣的同学可以去看看从代码里可以看到 CAS 的实现离不开处理器的支持根据当前处理器的类型来决定是否为 cmpxchg 指令添加 lock 前缀。如果程序是在多处理器上运行就为 cmpxchg 指令加上 lock 前缀lock cmpxchg。反之如果程序是在单处理器上运行就省略 lock 前缀单处理器自身会维护单处理器内的顺序一致性不需要 lock 前缀提供的内存屏障效果。讲到这儿同学们会发现CAS的操作比较更新与原子性有关了具体 CPU 是如果实现原子性的呢我们有机会继续深挖分解。评论留言少 BUG 点赞转发不脱发