本章内容
image.png
image.png定义Account接口(对余额的多次修改)
image.png—->image.png无锁但结果正确

balance设为AtomicInteger原子整数类,真正修改时的代码块确认只有修改成功,新的account写入主存中才会退出循环。

1、CAS与volatile

cas

image.pngimage.png
核心部分在于withdraw用了CAS(compare and set比较并设置的)方式保证了account的原子性

volatile

image.pngAtomicInteger源码
image.png
为什么无锁效率高
image.png

cas特点

image.png

主要是避免了频繁的上下文切换

2、JUC下的atomic子包

原子整数

image.png

AtomicInteger

image.png

AtomicInteger的updateAndGet

image.png<=====>image.png
用自己的方式实现updateAndGet内部逻辑如上(intUnaryOperator接口传入一个参数,可以自定义对参数的运算逻辑,此处的prev代表i。方法appluAsInt传入一个int参数,返回一个int结果)

updateAndS简写方式如下

image.png—->image.png—->image.pngupdateAndGet中可以写lambda表达式对原子整数做任意操作

原子引用

image.png

AtomickReference

image.png定义DecimalAccount接口
image.png定义DecimalAccountCas实现DecimalAccount接口
image.png—->image.png

可见对于AtomicReference类同样保证了原子操作。

ABA问题
image.png A修改为C且中途休眠1秒,调用other方法

image.pngother方法在其休眠期间更改了A的值
image.png

由结果可见,共享变量A的值中途修改之后又变回A,但是主线程无法感知到 image.png

解决办法如下

AtomicStampedReference

image.png
image.png
image.png

由输出可见,主线程可以看见休眠期间其他线程对A的修改,所以修改失败

image.png

AtomicMarkableReference

image.png
image.png定义垃圾袋类
image.png
image.png主线程逻辑如上
image.png

字段更新器

image.png
image.png

原子累加器

性能比较

原子累加器的性能要比AtomicInteger的性能高很多,两者功能相近。
image.png
keyi
image.png—->image.png
不难看出原子累加器的性能要高的多
image.png