`

CAS一点个人理解

    博客分类:
  • java
 
阅读更多
 public final int getAndIncrement() {
        for (;;) {
            int current = get();
            int next = current + 1;
            if (compareAndSet(current, next))
                return current;
        }
    }

 首先CAS是一种乐观锁,它没有锁的概念,没有同步,通过比较预期值(版本号)和当前值来确认能否修改,如果比较一致则可以修改,否则就自旋(死循环),调整版本号,重新计算,重新检测,再判断是否一致。所以存在浪费CPU的问题。

上面这个是Java AtomicInteger源码,实现i++。体会下代码逻辑:

假设,一开始value值是1,两个线程同时进来自增,线程1、线程2的预期值和新值一样,分别是1,2。假设线程2,检测当前值和预期值一样都是1 然后用新值2修改。线程1再来检测,发现此时当前值是2,而预期值是1,所以失败,进入下一次循环,此时当前值是2,所以重新获得预期值2(相当于提升了版本号),新值3,再去检测,此时当前值和预期值一样都是2(如果此时又有线程3修改,则又会重复以上步骤),所以修改成功,最后是3.

所以如果线程写操作频繁,那么自旋时间越久,所以CAS不适合写多的场景。

 

https://www.jianshu.com/p/1acdfac2b4e4?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics