本章内容
定义Account接口(对余额的多次修改)
—->无锁但结果正确
balance设为AtomicInteger原子整数类,真正修改时的代码块确认只有修改成功,新的account写入主存中才会退出循环。
1、CAS与volatile
cas
核心部分在于withdraw用了CAS(compare and set比较并设置的)方式保证了account的原子性
volatile
cas特点
主要是避免了频繁的上下文切换
2、JUC下的atomic子包
原子整数
AtomicInteger
AtomicInteger的updateAndGet
<=====>
用自己的方式实现updateAndGet内部逻辑如上(intUnaryOperator接口传入一个参数,可以自定义对参数的运算逻辑,此处的prev代表i。方法appluAsInt传入一个int参数,返回一个int结果)
updateAndS简写方式如下
—->—->updateAndGet中可以写lambda表达式对原子整数做任意操作
原子引用
AtomickReference
定义DecimalAccount接口
定义DecimalAccountCas实现DecimalAccount接口
—->
可见对于AtomicReference类同样保证了原子操作。
ABA问题
A修改为C且中途休眠1秒,调用other方法
other方法在其休眠期间更改了A的值
由结果可见,共享变量A的值中途修改之后又变回A,但是主线程无法感知到
AtomicStampedReference
由输出可见,主线程可以看见休眠期间其他线程对A的修改,所以修改失败
AtomicMarkableReference
字段更新器
原子累加器
性能比较
原子累加器的性能要比AtomicInteger的性能高很多,两者功能相近。
keyi
—->
不难看出原子累加器的性能要高的多