上一篇Atmoic文章中提到,JDK8在AtomicInteger
的getAndIncrement
方法实现上发生了变化:
JDK7
|
|
JDK8
|
|
getAndAddInt
1234567public final int getAndAddInt(Object paramObject, long paramLong, int paramInt) { int i; do i = getIntVolatile(paramObject, paramLong); while (!(compareAndSwapInt(paramObject, paramLong, i, i + paramInt))); return i;}
|
|
汇编之后
|
|
|
|
原本的lock cmpxchg
被lock xadd
所替换,也就是在1.8之后,在硬件支持lock XADD
这样的操作情况下,都会用fetch-and-add来替换CAS操作。