[英]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
並嘗試設置它。 如果兩個線程相互競爭以更改值,則其中一個增量可能會失敗。
請考慮以下情形:
get
並獲取值1
。 next
計算為2
。 get
並獲取值1
。 next
計算為2
。 現在因為原子 - 只有一個線程會成功 , 另一個線程會從compareAndSet
接收到false
並再次轉向。
如果沒有使用這種機制,那么兩個線程很可能遞增該值,導致實際上只有一個增量。
for(;;)
的混亂無限循環只有在許多線程同時寫入變量時才會真正循環。 在非常重的負載下,它可能會循環幾次,但應該很快完成。
for (;;)
是一個無限循環,因此它只會重試該嘗試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.