/**
* Atomically increments by one the current value.
*
* @return the previous value
*/
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
}
//===========
public final int getAndAddInt(Object o, long offset, int delta) {
int v;
do {
v = getIntVolatile(o, offset);//------------0---------------
} while (!compareAndSwapInt(o, offset, v, v + delta));//-------------1-------------
return v;
}
看了好多篇帖子依然沒搞懂。。。
最不理解的一點是,compare的兩個引數,oldValue與當前value都是哪里來的?
能理解為,原子類AtomicInteger本身含有一個關于oldValue的拷貝,然后compareAndSwapInt()的時候,根據偏移量去找主記憶體的對應oldValue的當前值,如果相同則修改,不同則重新進回圈重新讀取主記憶體oldValue當前值,重新對比?直到兩者一樣,再加一?
另外,想問下,這個原子性體現在哪了?是說運行著整個getAndIncrement()方法是原子性的?某個執行緒運行這方法時不會被中斷運行另一執行緒,還是怎么個原子性?
求高人指點。
uj5u.com熱心網友回復:
比較和替換這一步是原子性操作,也就是打包一塊執行, 你想過沒有,如果比較和替換不是原子性,在執行緒持有的oldValue和主記憶體的oldValue一致的時候,你正要替換,然后執行緒阻塞了,等輪到執行緒進行替換操作了,值被更細了,那資料就錯了uj5u.com熱心網友回復:
CAS你就將其想成在不加鎖的情況下,多執行緒去修改一個變數,能保證只有一個執行緒能修改成功。之所以要進行值比較,是確保要修改的值沒有被其他執行緒更改轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/195564.html
標籤:Java EE
上一篇:求助:關鍵ci查找問題
