什么是CAS
CAS即 compare and swap,比较和交换;
CAS是CPU的一条指令,是原子的,不会造成指令重排序;
由于CAS可以判定寄存器与内存中的值是否相等,若相等,就认为这个值没有被修改,因此接下来的操作就是线程安全的;
CAS可以实现原子类、自旋锁,可以避免加锁;
什么是ABA问题
现有两个线程thread1和thread2,有一个变量count = 1;
现让thread1先后两次获取count的值,发现都是1,但可能thread2对count进行了修改,但在thread1第二次获取count的值之前又将count的值改回了1,那么thread1第二次获取到的count的值就是1,虽然thread1先后两次获取到的count的值相等,但count的值发生了改变;
如何解决ABA问题
我们可以引入一个特征值来标记一个变量是否被修改但又改了回来,这个特征值这能加不能减,变量每修改一次,这个特征值就加1,现有两种方案:
1.使用时间戳:每一时刻的时间戳都是不一样的,但有一种特特例,就是闰秒,闰秒会造成前后两次的时间戳是相等的,这样就导致线程会认为变量没有被修改,会造成线程安全问题,因此不见时使用时间戳作为特征值;
2.使用版本号:自己定义一个变量,这个变量只能加不能减,只要变量被修改就会将版本号加1,这样线程获取到版本号时,发现版本号被修改就会知道这个变量被修改过。