上一篇:
一、ABA问题
变量当前值是A,这时线程1执行一次CAS操作,读出了这个变量的原值是A,然后线程2将变量的值改为了B,此时又来了一个线程3将变量的值从B又改为了A,最后 线程 1执行完了变量的修改,发现此时变量的值还是A,所以CAS操作成功了。但是变量经历了A -> B ->A这个过程,可能就会出现一些问题。所以atomic包里有AtomicStampedReference类,就是会比较两个值的引用是否一致,如果一致,才会设置新值;
一般情况我们使用AtomicInteger,常见的是计数,所以说一般是不断累加的,所以ABA问题比较少见;
二、无限循环问题
从上一篇的源码分析中就知道Atomic类设置值的时候会进入一个无限循环,只要不成功,就不停循环再次尝试,这个在高并发修改一个值的时候其实挺常见的,比如你用AtomicInteger在内存里搞一个原子变量,然后高并发下, 多线程 频繁修改,其实可能会导致这个compareAndSet()里要循环N次才设置成功;
JDK 1.8引入的LongAdder来解决,我们下一篇重点分析一下;
三、多变量原子问题
类似AtomicInteger、AtomicLong、AtomicBoolean这些Atomic都是对基本数据类型进行CAS操作,如果我们需要对多个变量保证原子性呢?
那么就需要使用AtomicReference,多个变量可以封装为一个自定义对象,使用AtomicReference的话就可以比较对象的引用是不是同一个,保证多个变量的原子性;