Java并发编程:理解CAS
最近看到一道面试题——“谈谈你对Java中无锁模型的认识?”,一瞬间脑子里有很多想法,但是不知道该怎么组织语言。
无锁的话那我自然会先往乐观锁的方面去想,平时在数据库中也常用到过乐观锁,就是添加一个自增的字段,每次对数据进行更新操作顺带自增一下字段,当然更新前需要获取到这个字段的值,并且在更新的时候作为条件传入。Java并发编程与无锁相关的会先想到java.util.concurrent.atomic这个包下的工具类,能够对数据进行原子操作,而这些工具类的实现就离不开CAS,所以为了加深对Java并发编程的理解,我打算以CAS算法为主,至下而上的学习包括AQS和JUC中的各类组件,一篇文章篇幅可能太长,多写几篇试试。
初识CAS
为了了解CAS首先弄懂下面几个问题?
虽然在平时开发中加锁同步代码很方便也易于理解,但是独占锁是具有一些劣势的
非阻塞算法
性能消耗很大,CAS它实际上是直接利用了 CPU 层面的指令,所以性能很高。
CAS包含三个操作数:需要读写的内存位置V,进行比较的值A,待更新的值B,当且仅当V的值等于A,CAS才会通过原子的方式将B的值更新到V,并且无论是否更新成功都返回V原有的值。更新失败情况下一般会进行自旋,也就是一直循环继续尝试CAS操作,当然自旋的次数也可以进行设置。
就是说一个线程把数据A变为了B,然后又重新变成了A。此时另外一个线程读取的时候,发现A没有变化,就误以为是原来的那个A。
参考资料
1.《Java并发编程实战》
2. https://www.cnblogs.com/fengzheng/p/9018152.html