AtomicInteger:getAndIncrement()的實作原理求解
javaatomicinteger
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
書上說:
原始碼中for回圈體的第一步先取得AtomicInteger里存盤的數值,第二步對AtomicInteger的當前數值進行加1操作,關鍵的第三步呼叫compareAndSet方法來進行原子更新操作,該操作先檢查當前數值是否等于current,等于意味著AtomicInteger的值沒有被其他執行緒修改過,則將AtomicInteger的當前數值更新成next的值,如果不等compareAndSet方法會回傳false,程式會進入for回圈重新進行compareAndSet操作。
我的疑問:
如果已經被其他執行緒修改過,此時再執行for()回圈有什么意義呢?預期將3變成4,可誰知這時候被其他執行緒改成5了,不滿足compareAndSet,此時重新進去for()回圈又能怎么樣呢?費解
uj5u.com熱心網友回復:
這個方法是執行加一操作的,不能判斷當值等于幾的時候才執行加一,如果有這樣的邏輯應該在呼叫這個方法之前判斷uj5u.com熱心網友回復:
這個方法只是完成自己本身的功能,而你不理解是因為你沒有把這兩個方法的功能與應用場景結合起來!uj5u.com熱心網友回復:
都2020年了 都被翻了出來uj5u.com熱心網友回復:
那你這么說的話,說明你沒有看它的構造方法,它構造方法里傳入一個int值的時候,會把value賦值給私有變數,這個變數是用volatile修飾的,也就是說,他每次取值取得是自己快取變數中的副本,由于這個變數使用了volatile,每次這個變數更改的時候,它們都會重新去記憶體中取入新的值來當做新的副本變數,所以說 它副本里的變數并不是取來之后就不變了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/39608.html
標籤:Java相關
