AtomicInteger實現

在CAS操做中,會出現ABA問題。java

  • 就是若是V的值先由A變成B,再由B變成A,
  • 那麼仍然認爲是發生了變化,並須要從新執行算法中的步驟。
  • 有簡單的解決方案:
    • 不是更新某個引用的值,而是更新兩個值,包括一個引用和一個版本號,
    • 即便這個值由A變爲B,而後爲變爲A,版本號也是不一樣的。
  • public final int incrementAndGet() {
            for (;;) {
                int current = get();
                int next = current + 1;
                if (compareAndSet(current, next))
                    return next;
            }
        }
    //這個方法的作法爲先獲取到當前的 value 屬性值,
    //    而後將 value 加 1,賦值給一個局部的 next 變量,
    //    然而,這兩步都是非線程安全的,
    //可是內部有一個死循環,不斷去作compareAndSet操做,直到成功爲止,
    //    也就是修改的根本在compareAndSet方法裏面,compareAndSet()方法的

     

https://blog.csdn.net/qfycc92/article/details/46489553算法

相關文章
相關標籤/搜索