Java中锁的学习-p2-CAS中ABA问题

上篇文章中,讲到了CAS自旋的过程,最后遗留了一个问题,自旋过程中,进行取值比较时,可能会产生ABA问题。

 

什么是ABA问题?

 

ABA问题就是在取值比较时,取到的值不是原来的值,但是值是相等的也就是在操作过程中,有别的线程先进行了操作。

举个例子:

    1、线程A进入,取到值为0,记录为R;

    2、线程B进入,取到值为0,记录为R1;

    3、线程B取值比较并修改为1;

    4、线程C进入,取到值为1,记录为R2,并修改值为0;

    5、线程A再次取值比较,取到值为0,和记录值比较,相等,就去修改了。

很显然,在线程A修改的过程中,有别的线程进入并修改值,只是修改后的值和原来一样,虽然线程A操作成功了,但是存在一些潜在的问题,若是锁的变量和其他业务或变量无关系还好,但是有关系的话,就会产生一系列影响。

 

简单的来解释就是,比如你有一个女朋友,然后分手了,你女朋友和别人有好上了,但过段时间又和别人分手,然后来和你复合,那么女朋友还是那个女朋友,其他的就不一定了。

 

怎么解决ABA问题?

 

其实很简单,既然我们不知道有没有被谁修改过,那就去想办法知道有没有被修改过,怎样知道?

 

给锁的变量设置一个标识,如版本号,每次读取,都获取该版本号,每次被修改,都让版本号加1,那么再修改之前,比较值和其版本号,若版本号和值对应,显然没被改过,不对应,那就肯定有别的线程修改过了。

 

以上就是CAS中的ABA问题及解决办法!  若有错误,请指正。

 

Java中锁的学习-p2-CAS中ABA问题