AtomicInteger来研究在没有锁的情况下是如何做到数据正确性的?
这里举例说明一个方法:getAndIncrement
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
这里面有个compareAndSet方法,其实是JNI调用,
在这里采用了CAS操作,每次从内存中读取数据然后将此数据和+1后的结果进行CAS操作,如果成功就返回结果,否则重试直到成功为止。
而compareAndSet利用JNI来完成CPU指令的操作。