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失败,而再次循环。 
posted @ 2020-07-25 16:37  德华。  阅读(468)  评论(0编辑  收藏  举报