首页 > 编程语言 >【Java教程】Day15-16 多线程:线程同步——Java的原子操作类

【Java教程】Day15-16 多线程:线程同步——Java的原子操作类

时间:2025-01-01 16:28:49浏览次数:3  
标签:Java 16 int AtomicInteger CAS 线程 AtomicLong 操作 多线程

在 Java 中,除了常见的底层锁和并发集合类,java.util.concurrent 包还提供了一组专门用于原子操作的封装类,位于 java.util.concurrent.atomic 包。通过这些类,我们可以在多线程环境下安全地进行无锁操作,避免了传统锁的性能开销。今天我们就来详细了解其中一个常用的类:AtomicInteger

1. 原子操作类概述

java.util.concurrent.atomic 包中的类提供了一些常见的数据类型(如 AtomicIntegerAtomicLong)的原子操作。这些类的核心特性是它们通过无锁(lock-free)方式实现线程安全,从而避免了传统同步机制的性能瓶颈。

我们以 AtomicInteger 为例,来了解其提供的一些常见操作:

1.1 主要操作
  • 增加值并返回新值int addAndGet(int delta)
    该方法将给定的增量 delta 加到当前值,并返回更新后的新值。

  • 加1后返回新值int incrementAndGet()
    该方法将当前值加1,并返回加1后的新值。

  • 获取当前值int get()
    该方法返回当前的值。

  • 使用CAS方式设置boolean compareAndSet(int expect, int update)
    该方法通过比较当前值是否为 expect,如果相等,则将其更新为 update,并返回 true,否则返回 false

1.2 CAS(Compare and Set)操作

AtomicInteger 以及其他原子类的底层实现基于 CAS(Compare and Set) 操作。CAS 操作是一种无锁的线程安全机制,其原理是:在操作过程中,它会比较当前值和预期值是否一致,如果一致,则更新为新值;如果不一致,说明另一个线程已修改了值,当前线程会重新获取最新的值。

举个例子,如果我们自己通过 CAS 编写 incrementAndGet() 方法,它大概长这样:

javapublic int incrementAndGet(AtomicInteger var) {    int prev, next;    do {        prev = var.get();  // 获取当前值        next = prev + 1;   // 增加1    } while (!var.compareAndSet(prev, next));  // CAS操作,直到成功    return next;  // 返回更新后的值}

CAS 操作保证了即使多个线程同时修改 AtomicInteger 的值,也能确保最终的更新是正确的。

2. 使用 AtomicLong 实现全局唯一ID生成器

AtomicLong 和 AtomicInteger 类似,用于提供对 long 类型数据的原子操作。我们可以使用它来实现一个线程安全的全局唯一 ID 生成器。例如:

javaclass IdGenerator {    AtomicLong var = new AtomicLong(0);    public long getNextId() {        return var.incrementAndGet();  // 线程安全的自增操作    }}

在这个例子中,AtomicLong 用于生成一个递增的全局唯一 ID。每次调用 getNextId() 时,var 会自增 1,并返回新值。

3. Java 8 中的新原子类:LongAdder 和 LongAccumulator

在高竞争场景下,AtomicInteger 和 AtomicLong 的性能可能会有所下降。为了解决这个问题,Java 8 引入了 LongAdder 和 LongAccumulator,这两个类在高并发情况下能提供更好的性能。

  • LongAdder:专为高并发环境设计,通过将数据分配到多个变量上,减少了线程间的竞争。它适用于高并发的累加场景。

  • LongAccumulator:与 LongAdder 类似,但它允许用户自定义累加操作。

这两个类的设计使得在高度竞争的环境下,也能保证性能的优化。

4. 小结

  • 原子操作:通过 java.util.concurrent.atomic 包提供的类(如 AtomicInteger 和 AtomicLong),我们可以实现无锁的线程安全操作,避免了传统锁带来的性能开销。

  • 适用场景:这些原子类适用于计数器、累加器等需要频繁更新的场景,尤其是在高并发环境下,它们的表现优于传统的同步机制。

  • 使用方便AtomicInteger 提供了简单易用的操作方法,如 incrementAndGet()compareAndSet() 等,使得多线程编程更加简洁高效。

通过使用原子类,开发者可以在保证线程安全的同时,提升程序的性能,避免了传统锁机制的瓶颈,特别是在高并发场景下,能够有效地提高系统的吞吐量。

标签:Java,16,int,AtomicInteger,CAS,线程,AtomicLong,操作,多线程
From: https://blog.csdn.net/max202011161630/article/details/144836378

相关文章

  • 【Java教程】Day14-01 加密与安全:从ASCII到Base64
    ​1.什么是编码?在计算机科学中,编码(Encoding)是将信息从一种格式转换成另一种格式的过程。在我们日常生活中,编码算法广泛应用于文本、文件和网络传输等领域。了解编码的基础知识是学习计算机编程与算法的第一步。1.1ASCII编码ASCII(AmericanStandardCodeforInformationI......
  • 【Java教程】Day11-07 时间与日期:日期与时间API的转换与数据库存储
    Java提供了两个日期与时间处理API:旧的 java.util.Date 和 java.util.Calendar,以及新的 java.time 包。新的API以 Instant、LocalDateTime 等为核心,具有更清晰的设计和更强大的功能。除非你需要与遗留代码进行交互,否则建议使用新的API。在需要将新旧API进行转换时,......
  • java毕业设计基于SpringBoot的高校运动会管理系统
    一、项目介绍开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven————————————————二、功能介绍后端技术SpringBoot:作为系统的后端框架,SpringBoot提供了快速搭建......
  • [Java/Spring] 深入理解:Spring Web DispatcherServlet
    1概述:SpringWebDispatcherServletDispatcherServlet简介org.springframework.web.servlet.DispatcherServlet是一个Servlet,它接收所有的HTTP请求,并根据请求的信息将其分发给相应的处理器(Handler)进行处理。它是SpringMVC架构模式中的关键部分,将请求处理逻辑与实际的......
  • JAVA生成验证码
    1、生成方式(验证码字符串、图片验证码、base64验证码图片)/***@description:使用方式1:直接获取验证码字符串,前端进行自定义渲染*@date:2024/12/1611:37*@param*@returnjava.lang.String*/@GetMapping('/getCode')public......
  • [Java] Spring Event 发布-订阅模式:解耦与异步通信的高效实现
    序Spring框架通过发布/订阅模式为组件间通信提供了高效且松散耦合的解决方案,提升了系统的灵活性和扩展性。本文探讨该模式的原理、实现、应用场景及其优势与挑战。1发布订阅模式:基本概念发布-订阅模式,又称为观察者模式(ObserverPattern)的一种变体,是一种基于消息传递的设......
  • 记忆旅游系统|Java|SSM|VUE| 前后端分离
                  【技术栈】1⃣️:架构:B/S、MVC2⃣️:系统环境:Windowsh/Mac3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7+4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html5⃣️数据库可视化工具:navicat6⃣️服务器:SpringBoot自带apacheto......
  • Java代码实现优先级队列
         最近看了PriorityQueue的源码实现后,我深有感悟,其实本质上就是用了堆的数据结构,我也自己尝试实现了优先级队列的代码,不多说了,代码如下。目录源码实现 测试用例代码源码实现    最近看了PriorityQueue的源码实现后,我深有感悟,其实本质上就是用了堆......
  • Java重要面试名词整理(十七):Nacos
    文章目录架构演化技术选型概念相关核心概念核心功能设计注册中心CP架构分析BASE理论配置中心架构演化我们认为架构发展历史经历了这样一个过程:单体架构——>垂直架构——>SOA面向服务架构——>微服务架构。SOA(Service-OrientedArchitecture),面向服务的架......
  • [2608]基于JAVA的纪念品拍卖智慧管理系统的设计与实现
    毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的纪念品拍卖智慧管理系统的设计与实现指导老师(一)选题的背景和意义选题背景和意义随着互联网技术的快速发展,电子商务已经成为全球商业活动的重要组成部分。其中,拍卖作为一种特殊的交易方式,在线拍卖系统也逐渐受到......