说到Java锁机制,我们可以暂时将Java的锁分为乐观锁和悲观锁。它们是整个并发编程中很重要的基石,也是面试当中经常会被问到的知识点。今天我们就来总结一下乐观锁的那些事。
什么是乐观锁
既然说到了乐观锁,那么就需要先解释一个问题,即什么是乐观锁?
顾名思义,乐观锁就是一种理想化的状态,非常乐观。每次去取数据的时候都认为其他线程不会对该数据进行修改,因此不会考虑上锁(毕竟一般上锁都是为了主动从防止一些“坏人”,而我们的乐观锁天真的认为没什么坏人)。
基于乐观锁的思想有很多种实现方式,而谈到这里就不得不说一下今天的主角,就是CAS("Compare and Swap)。
CAS技术
CAS是乐观锁的一种经典实现方式,当多个线程尝试更新一个变量的时候,只有一个线程能够更新成功,其它线程都会被告知更新失败,但是失败的线程并不会挂起而是会自旋等待并重试。再整个CAS实现当中,有几个参数需要给大家解释一下:V(内存的新值),A(期待值),B(要写入的值)。而CAS的工作过程即:先去读取一次内存当中的旧值作为期待值,再准备向数据B之前,再次取内存当中读取该值是否有被修改。如果被修改(A != V),则放弃被次操作并自旋重试。如果没有被修改,则写入该值。由于其简单的轻量级的实现方式,JUC当中也有大量的工具类选择基于CAS进行实现:Atomic相关类,ReentrantLock中的FairSync类等。
接下来我们通过源码的方式,具体看一下CAS在At