【发布时间】:2017-03-13 15:48:04
【问题描述】:
getAndIncrement的源码为:
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
我不明白为什么会有循环。如果其他一些线程改变了值,那它怎么可能是原子的?
假设值为5,那么我调用getAndIncrement(),我们期望它是6,但同时一些其他线程已经将值更改为6,那么getAndIncrement()会将值变为7,这不是预期的。
我哪里错了?
【问题讨论】:
-
@yshavit 你提到的链接没有回答我的问题,你能检查一下吗?谢谢!
-
@yshavit 那么为什么要重试呢?我不明白这一点。假设它的原始值是5,现在我想把它变成6,但是如果其他线程已经把它变成了6,它为什么要重试让它变成7?
-
该方法是原子的,因为它不受竞争条件的影响并且是线程安全的。如果一个线程将其设置为 6 并且您调用 getAndIncrement 您会期望它返回 7。
-
@Lily 嗯,一个线程需要返回 7,对吧?如果你从 5 开始,两个线程以原子方式递增它,那么一个应该返回 6,而另一个返回 7。
-
考虑这会做什么;
public synchronized int getAndIncrement() { return value++; }这有什么不同?
标签: java multithreading