Java中使用Atomic时的线程自旋结束原因?

java中使用atomic的时候,由于cas机制,获取到的实际值和预期值不一致,会进入自旋状态,也就是卡死状态,但实际开发中,代码却可以正常进入下次循环,为什么不会因为自旋而永远卡死在本次循环呢?

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicTest {

static volatile AtomicInteger num = new AtomicInteger(0);

public static void main(String[] args) throws InterruptedException {

//创建10个线程并启动

for (int i = 1; i <= 10; i++) {

new Thread() {

@Override

public void run() {

// 每个线程内部循环1万次,每次num自增1

for (int j = 0; j < 10000; j++) {

num.incrementAndGet();//进行cas操作,这时候可能会产生cas自旋,产生自旋后为啥不会卡死,仍然可以结束本次循环

}

}

}.start();

}

Thread.sleep(3000);//保证获取到的num值为所有线程执行完毕后最新的值

System.out.println("最终获取到的num=" + num.get());

}

}


回答:

自旋并不是卡死,只是在不断的尝试。一次失败并不意味着以后就一定会一直失败。否则重复尝试就没有意义了。

尝试成功了自然就结束了。


回答:

多看源码就知道了,这是一个do while死循环,会一直尝试直到完成更新,每一次会获取当前原子对象最新的值,并执行+1操作,比如由两个Thread1和Thread2 都获取到v的值为10,1成功+1 v值变成11了,2 会失败,然后会尝试再次获取新的值,此时获取到v=11,然后再尝试+1,成功,v最后变成12,以下是相关操作的JDK最底层代码

 @HotSpotIntrinsicCandidate

public final int getAndAddInt(Object o, long offset, int delta) {

int v;

do {

v = getIntVolatile(o, offset);

} while (!weakCompareAndSetInt(o, offset, v, v + delta));

return v;

}

以上是 Java中使用Atomic时的线程自旋结束原因? 的全部内容, 来源链接: utcz.com/p/945506.html

回到顶部