i++和++i是否爲原子操作?怎麼確保原子性

一.i++

i++的操作分三步:

(1)棧中取出i

(2)i自增1

(3)將i存到棧

所以i++不是原子操作,上面的三個步驟中任何一個步驟同時操作,都可能導致i的值不正確自增

二.++i

在多核的機器上,cpu在讀取內存i時也會可能發生同時讀取到同一值,這就導致兩次自增,實際只增加了一次。

綜上,我認爲i++和++i都不是原子操作。
 

 

三、確保原子性

1、加鎖

 

2、爲了保證其原子性,可以使用AtomicInteger類的getAndIncrement()方法實現i++

我們先來看一下getAndIncrement的源代碼:
         *    public final int getAndIncrement() {
         *        for (;;) {
         *              int current = get();  // 取得AtomicInteger裏存儲的數值
         *            int next = current + 1;  // 加1
         *            if (compareAndSet(current, next))   // 調用compareAndSet執行原子更新操作
         *                return current;
         *        }
         *    }

其核心原理是CAS(compareAndSwap)原理

通過內存值V 預期值A 更新值B  先對v和A進行比較 如果相等 則將v更新爲B 如果不相等則不更新。

CAS的操作雖然也是多個步驟,但CAS是通過硬件命令保證了原子性。
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章