原子操作类 CAS
戳 蓝色字“ 码之初 ”关注,每天都进步! 来源: https://www.zhangjianbing.com/archives/54/ CAS (compare and swap),即:比较然后交换。 CAS 的原理 三个运算符:一个内存地址 V,一个期望值 A,一个新值 B。 基本思路:如果地址 V 上的值和期望值 A 相等,返回 true,并给地址 V 赋上新值 B,如果不是,返回 false,不做任何操作。 循环 (死循环,或者叫自旋) 里不断的进行 CAS 操作。 现代处理器都支持 CAS 的指令,循环这个指令,直到成功为止。 CAS 所带来的问题 1.ABA 问题。 所谓的 ABA 问题就是假设某个内存地址上有一个数值 A,但一个线程过来后把它变成了 B,然后又变回了 A,另一个线程过来后,发现内存地址上的值和期望的值一样,故 CAS 成功了,其实,内存地址上的值发生了变化,这种问题可以用加版本号的方式来解决。下面代码会演示。 2. 系统开销问题。 当一个 CAS 操作永远不成功,它就会一直自旋,系统开销巨大,遇到这种情况,我们只能使用 syn 锁或者其他锁的方式来替代 CAS 操作了。 3. 只能保证一个共享变量的原子操作。 就是只能够保证一个共享变量,如果想保证多个变量的话,可以将这些变量放入一个引用变量中,atomic 为我们提供了操纵引用变量的类,叫