Lil*_*ily 3 java multithreading
getAndIncrement的源代码是:
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么有一个循环.如果其他一些线程更改了值,那么它怎么可能是原子的呢?
假设值为5,然后我调用getAndIncrement(),我们期望它为6,但同时其他一些线程已将值更改为6,然后getAndIncrement()将使值为7,这是不可预期的.
我哪里错了?
循环将继续下去,直到它设法做get()的+1,而compareAndSet没有任何其他线程获得在compareAndSet第一.如果另一个线程确实获得了compareAndSet,则该线程的compareAndSet将失败,并且循环将重试.
最终结果是每次调用getAndIncrement()都会导致该值的一个增量.如果该值最初为5,并且两个线程调用getAndIncrement(),则一个将返回6而另一个将返回7.
换句话说:其中一个似乎完全发生在另一个之后,这就是"原子"的意思.