CAS(Compare And Swap)是由硬件实现的。
CAS可以将读 改 写 这类的操作转换为原子操作
这个问题是当绿色线程走到第二步,还没有到第三步。此时蓝线程开始了第一步,这样这个变量的期待值不是12 而是11.
ABA问题
CAS:在数据更新到主内存前(也就是图中第二步与第三步之间),将再次读取内存共享变量的值,如果现在读取的值与第一步的值一样就执行最后一步,把数据更新到线程的内存的主内存中,如果不一样则就撤销本次操作。
这里还有个问题:有个假设共享变量的当前值与当前线程提供的期望值相同,就认为这个变量没有被其他线程修改过。 但是这种不一定是对的 比如有个共享变量count =0;线程a将count修改为20,线程b将count修改为10,线程c将count修改为0.又有个当前线程看到变量count值为0,线程就认为这个变量没有被其他线程修改过。
若想要规避这个aba问题,可以为共享变量一如一个时间戳,每次修改共享变量相应的时间戳就会改变,这样就可以查看有没有被更改过。
原子变量类
原子变量类基于CAS实现的,当对共享变量进行read-modify-write更新操作时,通过原子变量可以保障操作的原子性与可见性。对变量read-modify-write更新操作是指当前操作不是一个简单的赋值,而是变量的新值依赖变量的旧值,如自增操作i++,由于volatile只能保证操作的可见性,无法保障原子性,原子变量类内部就是借助一个volatile变量,并且保证了该变量的read-modify-write操作的原子性,有时把原子变量类看作是增强的volatile变量,原子变量类有12个
分组 | 原子变量类 |
基础数据型 | AtomicInteger,AtomicLong,AtomicBoolean |
数组型 | AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray |
字段更新器 | AtomicIntegerFileUpdater,AtomicLongfieldUpdater AtomicReferenceFileUpdater |
引用型 | AtomicReference,AtomicStampedReference AtomicMarkableReference |