首页 > 编程语言 >JAVA中CAS原理

JAVA中CAS原理

时间:2024-03-26 09:01:36浏览次数:28  
标签:尝试 currentValue JAVA CAS atomicInteger int 线程 AtomicInteger 原理

在Java中,CAS(Compare-and-Swap)是一种无锁算法,通过JNI(Java Native Interface)调用本地方法来利用处理器提供的原子指令实现。它可以保证在多线程环境下的原子性和可见性,而无需使用传统的锁机制。以下是一个简单的Java示例,通过java.util.concurrent.atomic包下的AtomicInteger类来演示CAS的原理:

import java.util.concurrent.atomic.AtomicInteger;

public class CASExample {
    public static AtomicInteger atomicInteger = new AtomicInteger(0);

    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                // 使用CAS尝试将原子整数增加1
                while (true) {
                    // 获取当前值
                    int currentValue = atomicInteger.get();
                    // 计算新的期望值
                    int newValue = currentValue + 1;
                    // 使用compareAndSet方法尝试原子地更新值
                    if (atomicInteger.compareAndSet(currentValue, newValue)) {
                        // 更新成功,退出循环
                        break;
                    } else {
                        // 更新失败,当前值已被其他线程改变,继续循环尝试
                    }
                }
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                // 同理,第二个线程也在尝试增加原子整数
                while (true) {
                    int currentValue = atomicInteger.get();
                    int newValue = currentValue + 1;
                    if (atomicInteger.compareAndSet(currentValue, newValue)) {
                        break;
                    }
                }
            }
        });

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 最终打印的结果将是20000,表明两个线程的操作是互斥且原子完成的
        System.out.println("Final Value: " + atomicInteger.get());
    }
}

上述代码中,我们创建了两个线程t1t2,每个线程都在尝试递增一个共享的AtomicInteger实例。compareAndSet方法接受两个参数:当前预期的值和新的值。这个方法尝试将原子整数的值从预期的当前值更新为新值,如果当前原子整数的实际值与预期值相匹配,则更新,并返回true;如果不匹配,则不执行更新操作并返回false。这意味着即使在高并发环境下,多个线程同时尝试更新同一变量时,只有一个线程能成功完成更新,其余线程将继续循环尝试直至成功,从而确保了在无锁的情况下也能实现并发控制和数据一致性。

标签:尝试,currentValue,JAVA,CAS,atomicInteger,int,线程,AtomicInteger,原理
From: https://blog.csdn.net/semicolon_hello/article/details/137002174

相关文章

  • 【附源码】java毕业设计生活旅行分享网站的设计与实现
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着经济的发展和生活水平的提高,旅行已经成为现代人休闲放松的一种重要方式。人们不仅希望在旅行中体验不同的文化、风光和生活,还愿意通过互联网与他人分......
  • [附源码]计算机毕业设计高校教材管理系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图项目介绍随着高校教育资源的不断扩充和教育体系的日益复杂化,高效的教材管理变得尤为重要。一个专业的高校教材管理系统能够实现教材信息的集中管理、库存状态实时监控、......
  • [附源码]计算机毕业设计大学生创新项目管理系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图项目介绍随着高等教育的不断发展,大学生创新项目成为培养学生创新能力和实践能力的重要途径。有效的项目管理对于确保创新项目的顺利进行和高质量完成至关重要。然而,目前......
  • java------字符串
    Java中字符串理解:1.字符串不可变,它们的值在创建后不能被更改。这里说的是,他们的值而不是地址值。 当我们使用Strings=“hello”;语句创建字符串的时候,首先会去常量池中查找,如果有,就返回这个常量的地址,如果没有,在常量池中创建并返回。world也是这样的。比如这里的“hello”......
  • [附源码]计算机毕业设计疫情下高校学生离校系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图项目介绍疫情的突发和持续影响使得高校学生离校管理面临前所未有的挑战。为了确保校园疫情防控的有效进行,同时保障学生的健康安全和合理流动,一个计算机毕业设计的疫情下......
  • 学习java时候的笔记(二)
    判断和循环判断结构if语句格式1:if(关系表达式){ 语句体;}Demoimportjava.util.Scanner;publicclassIfDemo1{publicstaticvoidmain(String[]args){/*需求:键盘录入女婿酒量,如果大于2斤,老丈人给出回应,反之不回应*/......
  • 学点儿Java_Day10_集合框架(List、Set、HashMap)
    1简介ArrayList:有序(放进去顺序和拿出来顺序一致),可重复HashSet:无序(放进去顺序和拿出来顺序不一定一致),不可重复 @Testpublicvoidtest1(){String[]array=newString[3];//List:有序可重复//有序:放入顺序与拿出顺序......
  • 学点儿Java_Day10_错题重测&勘误解析
    1.下列代码语法正确的是()A.bytei=100,j=200;可以通过编译,整型变量当然可以赋值为整数.B.shorts='a'+1;可以通过编译,因为编译时'a'+1会先被计算C.finalfloatPI;PI=3.14;不可以通过编译,因为PI是常量,定义时必须赋值D.charc=12345;不可以通过......
  • java毕业设计毕业照服装租赁小程序[附源码]
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在当今社会,随着智能手机的普及和移动互联网的快速发展,小程序作为一种新型的应用形式,因其无需下载安装、使用方便的特点而受到广大用户的青睐。特别是在服......
  • 【全开源】JAVA匿名情侣假装情侣系统源码支持微信小程序+微信公众号+H5_博纳软云
    匿名情侣假装情侣系统源码:让爱情悄然绽放在繁忙的都市生活中,你是否渴望一份不期而遇的爱情?我们推出的“匿名情侣假装情侣系统源码”,为你打开了一扇通往浪漫世界的大门。该系统源码设计精巧,操作简单,旨在为用户提供一个安全、私密的交友平台。在这里,你可以与心仪的TA开启一段假......