测试场景
cas,即compare and swap,比较后再交换,使用的场景:
线程1执行如下指令:
read a; a++;write a;
线程2执行如下指令:
read a;a++;write a;
此时有这样的执行顺序:
- 线程1:
read a;
(线程调度,线程1变为就绪状态,线程2变为运行状态) - 线程2:
read a;
a++;
write a;
(线程2执行完毕,被销毁或者休眠)
(线程1分到了时间片,开始执行) - 线程1
a++;
write a;
此时如果a的初始值为0,那么两个线程执行完最后的结果为1,而不是2。
cas策略(以AtomicInteger 的加1操作为例):
代码如下:
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
var5 = this.getIntVolatile(var1, var2);//先从内存中读取一个值&#x