

这个CAS算法看不明白,期望值E1什么时候变化。CAS算法如何保证线程安全的,麻烦再解释一下。
可以这么理解,有好几个线程都要改这个共享的变量V,其中某一个线程抢到了cpu,拿到了执行权限,这个线程手里有三个值:V\E\N,它认为共享变量V的值应该是E,如果真的是E,那么就将把这个共享的变量V的值改为N。否则,不要动这个共享变量V,只告诉这个线程,共享变量V现在的值是啥即可,这线程晓得了之后,就把自己手里的V和E的值更新一下,然后继续和其他线程争抢执行权限,直到修改成功为止。
你说的这种应该属于ABA问题,这个CAS是防止不了的
但我们可以再CAS的基础上解决这个问题:
- 采用CAS的一个变种DCAS,DCAS是对于每一个V增加一个引用的表示修改次数的标记符。对于每个V,如果引用修改了一次,这个计数器就加1,然后再这个变量需要更新的时候,就同时检查变量的值和计数器的值。都符合条件才可以修改V值。
- 将标记或版本编号与要进行CAS操作的每个值相关联,并原子地更新值和标记。也就是一旦V第一次被使用,就不会再重复使用,如有需要则分配新的V。垃圾收集器可以检查V,保证其不被循环使用,直到当前的访问操作全部结束