Java:关于CAS非线程阻塞的疑问?

public class Service {
    public static int NUM = 0;
    public static void increase() {
        NUM++;
        System.out.println(NUM);
    }
}

启动10个线程,每个线程对NUM自增10000次

for (int i = 0; i < 10; i++) {
    new Thread(() -> { 
        for (int j = 0; j < 10000; j++) {
            Service.increase();
        }
    }).start();
}

预期结果为100000,但实际输出可能为 99999
改进方式是使用使用synchronized修饰increase,但这种情况会造成线程阻塞,所以推荐使用CAS
我的疑问是:使用CAS的话线程仍然会不断的尝试并Compare and Swap,也做不了其他事情吧,这和线程阻塞了不是也差不多吗?

阅读 1.7k
1 个回答

竞争这么严重就不要并行了。

如果核足够多的话(至少要比线程数多),CAS 应该还是会快的。至少没有等待再唤醒的过程。

不过确实跟阻塞也一样,只是阻塞会释放CPU,CAS不会。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题