AtomicInteger类的工作原理-CAS机制
- #调用过程:
- 在Unsafe类中,调用了一个:compareAndSwapInt()方法,此方法的几个参数:
- var1:传入的AtomicInteger对象
- var2:AtommicInteger内部变量的偏移地址
- var5:之前取出的AtomicInteger中的值;
- var5 + var4:预期结果
此方法使用了一种"比较并交换(Compare And Swap)"的机制,它会用var1和var2先获取内存中AtomicInteger中的值,然后和传入的,之前获取的值var5做一下比较,也就是比较当前内存的值和预期的值是否一致,如果一致就修改为var5 + var4,否则就继续循环,再次获取AtomicInteger中的值,再进行比较并交换,直至成功交换为止。
- compareAndSwapInt()方法是"线程安全"的。
- 我们假设两个线程交替运行的情况,看看它是怎样工作的:
-
- 初始AtomicInteger的值为0
-
- 线程A执行:var5 = this.getIntVolatile(var1,var2);获取的结果为:0
- 线程A被暂停
- 线程B执行:var5 = this.getIntVolatile(var1,var2);获取的结果为:0
- 线程B执行:this.compareAndSwapInt(var1,var2,var5,var5 + var4)
- 线程B成功将AtomicInteger中的值改为1
- 线程A恢复运行,执行:this.compareAndSwapInt(var1,var2,var5,var5 + var4),此时线程A使用var1和var2从AtomicInteger中获取的值为:1,而传入的var5为0,比较失败,返回false,继续循环。
- 线程A执行:var5 = this.getIntVolatile(var1,var2);获取的结果为:1
- 线程A执行:this.compareAndSwapInt(var1,var2,var5,var5 + var4),此时线程A使用var1和var2从AtomicInteger中获取的值为:1,而传入的var5为1,比较成功,将其修改为var5 + var4,也就是2,将AtomicInteger中的值改为2,结束。
- CAS机制也被称为:乐观锁。因为大部分比较的结果为true,就直接修改了。只有少部分多线程并发的情况会导致CAS失败,而再次循环。