簡體   English   中英

AtomicInteger中的“比較和設置”如何工作

[英]How does “Compare And Set” in AtomicInteger works

AtomicInteger使用兩個概念:CAS和volatile變量。

使用volatile變量可確保當前值對所有線程都可見,並且不會被緩存。

但我對CAS(比較和設置)概念感到困惑,其解釋如下:

public final int getAndIncrement() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return current;
    }
 }

我的問題是if(compareAndSet(current, next)返回false ?值是否會更新?在這種情況下,當Thread執行以下情況時會發生什么:

private AtomicInteger count = new AtomicInteger();
count.incrementAndGet();

原子對象利用比較和交換機制使它們成為原子 - 即可以保證值指定的並且現在處於新值。

您發布的代碼不斷嘗試將當前值設置為比以前更多的值。 請記住,另一個線程也可以執行get並嘗試設置它。 如果兩個線程相互競爭以更改值,則其中一個增量可能會失敗。

請考慮以下情形:

  1. 線程1調用get並獲取值1
  2. 線程1 next計算為2
  3. 線程2調用get並獲取值1
  4. 線程2 next計算為2
  5. 兩個線程都嘗試寫入值。

現在因為原子 - 只有一個線程會成功另一個線程會compareAndSet接收到false並再次轉向。

如果沒有使用這種機制,那么兩個線程很可能遞增該值,導致實際上只有一個增量。

for(;;)的混亂無限循環只有在許多線程同時寫入變量時才會真正循環。 在非常重的負載下,它可能會循環幾次,但應該很快完成。

for (;;)是一個無限循環,因此它只會重試該嘗試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM