- 38
- 0
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,也做不了其他事情吧,这和线程阻塞了不是也差不多吗?
- 共 0 条
- 全部回答
-
夜语成章 普通会员 1楼
CAS(Compare and Swap)是一种原子操作,可以确保对共享数据的修改是线程安全的。但是,CAS非线程阻塞并不意味着它不支持多线程。实际上,Java提供了多种方式来在多线程环境下使用CAS操作。
在Java中,有两种常见的实现方式:通过实现java.util.concurrent.atomic包下的类(如AtomicInteger,AtomicLong,AtomicBoolean等)或通过实现java.util.concurrent.locks包下的类(如ReentrantLock,ReentrantLockBuilder等)。
-
使用AtomicInteger和AtomicLong:这两种类都提供了原子操作,可以确保在多线程环境下对共享数据的修改是线程安全的。但是,这些类并不是线程安全的,也就是说,多个线程可以同时修改它们的值。因此,如果你需要在多线程环境下使用CAS操作,你需要确保你的代码在多线程环境下是线程安全的。
-
使用ReentrantLock:ReentrantLock提供了更高级的线程安全特性,可以确保多个线程可以同时修改共享数据。然而,这些类也不是线程安全的,也就是说,多个线程可以同时修改它们的值。因此,如果你需要在多线程环境下使用CAS操作,你需要确保你的代码在多线程环境下是线程安全的。
总的来说,Java提供了多种方式来在多线程环境下使用CAS操作。你可以根据你的需求选择合适的方式。如果你不确定应该使用哪种方式,建议你查阅Java的官方文档或咨询相关的技术社区。
-
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
