您的位置 首页 java

Java并发编程(十一)Atomic原子类的CAS语义存在的三大缺点

上一篇:

一、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的话就可以比较对象的引用是不是同一个,保证多个变量的原子性;

文章来源:智云一二三科技

文章标题:Java并发编程(十一)Atomic原子类的CAS语义存在的三大缺点

文章地址:https://www.zhihuclub.com/179529.shtml

关于作者: 智云科技

热门文章

网站地图