本文是我通过对CAS相关博客的学习后自己的总结,如有错误请及时提出噢
首先从三个问题出发:
1、CAS如何提升自减和自增操作的并发效率
2、CAS遇到ABA问题如何解决
3、通过CAS如何实现一个无锁队列
CAS(Compare-and-Swap):实现了Check-and-Set原子操作功能;代表一种原子操作,是一种系统原语,原语的执行必须是连续的,在执行过程中不允许被中断。
----------------------------------------------------------------------------------------
问题一:CAS如何提升自减和自增操作的并发效率
CAS类似乐观锁,有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
程序员可通过这种乐观锁的机制实现自减和自增操作的高并发效率。
问题二:CAS遇到ABA问题如何解决
所谓ABA问题是在进行CAS操作的时候,因为在更改V之前,CAS主要询问“V的值是否仍然为A”,所以在第一次读取V之后以及对V执行CAS操作之前,如果先将值从A改为B,然后再改回A,这时CAS的询问仍然成立,则CAS操作会成功。
解决方案:
第一种:通常是采用CAS的一个变种DCAS,DCAS是对于每一个V增加一个引用的表示修改次数的标记符。对于每个V,如果引用修改了一次,这个计数器就加1,然后再这个变量需要更新的时候,就同时检查变量的值和计数器的值。都符合条件才可以修改V值。
第二种:通常通过将标记或版本编号与要进行CAS操作的每个值相关联,并原子地更新值和标记。也就是一旦V第一次被使用,就不会再重复使用,如有需要则分配新的V。垃圾收集器可以检查V,保证其不被循环使用,直到当前的访问操作全部结束。
问题三:通过CAS如何实现一个无锁队列
首先从三个问题出发:
CAS(Compare-and-Swap):实现了Check-and-Set原子操作功能;代表一种原子操作,是一种系统原语,原语的执行必须是连续的,在执行过程中不允许被中断。
----------------------------------------------------------------------------------------
问题一:CAS如何提升自减和自增操作的并发效率
CAS类似乐观锁,有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
问题二:CAS遇到ABA问题如何解决
所谓ABA问题是在进行CAS操作的时候,因为在更改V之前,CAS主要询问“V的值是否仍然为A”,所以在第一次读取V之后以及对V执行CAS操作之前,如果先将值从A改为B,然后再改回A,这时CAS的询问仍然成立,则CAS操作会成功。
问题三:通过CAS如何实现一个无锁队列
