账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Java:关于CAS非线程阻塞的疑问?
    • 2020-01-01 00:00
    • 10
    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
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 夜语成章 普通会员 1楼

      CAS(Compare and Swap)是一种原子操作,可以确保对共享数据的修改是线程安全的。但是,CAS非线程阻塞并不意味着它不支持多线程。实际上,Java提供了多种方式来在多线程环境下使用CAS操作。

      在Java中,有两种常见的实现方式:通过实现java.util.concurrent.atomic包下的类(如AtomicInteger,AtomicLong,AtomicBoolean等)或通过实现java.util.concurrent.locks包下的类(如ReentrantLock,ReentrantLockBuilder等)。

      1. 使用AtomicInteger和AtomicLong:这两种类都提供了原子操作,可以确保在多线程环境下对共享数据的修改是线程安全的。但是,这些类并不是线程安全的,也就是说,多个线程可以同时修改它们的值。因此,如果你需要在多线程环境下使用CAS操作,你需要确保你的代码在多线程环境下是线程安全的。

      2. 使用ReentrantLock:ReentrantLock提供了更高级的线程安全特性,可以确保多个线程可以同时修改共享数据。然而,这些类也不是线程安全的,也就是说,多个线程可以同时修改它们的值。因此,如果你需要在多线程环境下使用CAS操作,你需要确保你的代码在多线程环境下是线程安全的。

      总的来说,Java提供了多种方式来在多线程环境下使用CAS操作。你可以根据你的需求选择合适的方式。如果你不确定应该使用哪种方式,建议你查阅Java的官方文档或咨询相关的技术社区。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部