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,也做不了其他事情吧,这和线程阻塞了不是也差不多吗?
竞争这么严重就不要并行了。
如果核足够多的话(至少要比线程数多),CAS 应该还是会快的。至少没有等待再唤醒的过程。
不过确实跟阻塞也一样,只是阻塞会释放CPU,CAS不会。