CAS的ABA问题

关键要点

        CAS的关键要点,是比较寄存器1和内存的值,通过这里的值是否相等,来判定内存中的值是否发生了改变,

        如果内存中的值变了,就说明存在其他线程进行了修改

        如果内存中的值没变,说明没有别的线程修改,接下来进行的修改就是线程安全的,就可以用寄存器2中的值去修改内存中的值

ABA问题

        但寄存器1中的值与内存中的值相等就一定说明内存中的值没有改变吗?

        有可能存在一个线程将内存中的值由A->B,B->A,此时本线程区分不了,内存中的值是一直没变还是变了以后又被改回来了

        在大多数情况下ABA问题是没有什么bug的,但是在很特殊的情况下ABA问题还是会导致出现一些bug,因为CAS要判定的是内存中的值没有被其他线程修改过,而不是值没有发生改变。

解决方法

        我们如果约定,值只能单向变化(比如只能增长不能减小),这样就不会出现内存中的值反复横跳的情况了,但是大多数场景下数据不可能只增长不减小

        所以我们便新添加了一个属性来解决这个问题,我们添加了一个叫版本号的属性,版本号就规定只能增加不能减小,每当内存中的数据被修改,版本号就增加,使用CAS判定版本号是否相同,如果版本号相同,则数据一定是没有修改过的,如果数据修改过,版本号一定增加。

你可能感兴趣的:(java,开发语言)