一.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是通過硬件命令保證了原子性。