首页 > 其他 > 详细

AtomicInteger类的工作原理-CAS机制

时间:2020-07-25 21:43:24      阅读:68      评论:0      收藏:0      [点我收藏+]
  • 调用过程:

技术分享图片

  • 在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失败,而再次循环。 

AtomicInteger类的工作原理-CAS机制

原文:https://www.cnblogs.com/wxguo/p/13377229.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!