【JUC基础】10. Atomic原子类

这篇具有很好参考价值的文章主要介绍了【JUC基础】10. Atomic原子类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【JUC基础】10. Atomic原子类

1、什么是Atomic

Atomic英译为原子的。原子结构通常称为不可分割的最小单位。而在JUC中,java.util.concurrent.atomic 包是 Java 并发库中的一个包,提供了原子操作的支持。它包含了一些原子类,用于在多线程环境下进行线程安全的原子操作。使用原子类可以避免使用锁和同步机制,从而减少了线程竞争和死锁的风险,并提高了多线程程序的性能和可伸缩性。

2、为什么要使用Atomic

这里是JUC专栏,肯定是跟多线程有关系的。我们实现这样一个场景:2个线程对某个数值+1操作,每个线程累加10000次。

2.1、传统模式

package atomic;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author Shamee loop
 * @date 2023/5/22
 */
public class AtomicTest {

    private static int counter = 0;
    public static void main(String[] args) {
        // 多个线程并发地增加计数器的值
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                counter++;
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                counter++;
            }
        });

        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();

        System.out.println("Counter value: " + counter);
    }
}

执行结果:

【JUC基础】10. Atomic原子类

不管运行多少次,每次的结果都不一样,而且最终的值大概率都不会是20000。而20000才是我们期望的输出。

2.2、原子模式

package atomic;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author Shamee loop
 * @date 2023/5/22
 */
public class AtomicTest {

    // 原子性int
    private static AtomicInteger counter = new AtomicInteger(0);

    public static void main(String[] args) {
        // 多个线程并发地增加计数器的值
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                // 等同于++操作
                counter.incrementAndGet();
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                counter.incrementAndGet();
            }
        });

        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();

        System.out.println("Counter value: " + counter.get());
    }
}

运行结果:

【JUC基础】10. Atomic原子类

不管运行多少次,结果都是20000。可以看出代码中不需要加任何锁,Atomic在多线程场合天然的具备线程安全。

3、原子类

java.util.concurrent.atomic包下常用的原子类分为:

3.1、原子基本类型

  • AtomicInteger:整形原子类
  • AtomicLong:长整型原子类
  • AtomicBoolean :布尔型原子类

3.2、原子引用类型

  • AtomicReference:引用类型原子类

3.3、原子数组类

  • AtomicIntegerArray:整形数组原子类
  • AtomicLongArray:长整形数组原子类
  • AtomicReferenceArray :引用类型数组原子类

......

4、原子类是绝对线程安全吗?

首先,什么是线程安全问题?

在多线程编程中,线程安全是指多个线程同时访问一个共享资源时,不会产生不正确的结果或破坏数据结构的属性。

其实Atomic的原子性是指属性的存取(get/set)方法是线程安全,他的线程安全保证并不是简单的使用synchronized或lock锁。而是使用了乐观锁CAS(Compare And Swap,比较并交换)+volatile。关于CAS,可以参考《简单理解CAS》。正如CAS锁的ABA问题,它并不能保证对象是线程安全的。

因此Atomic并不是绝对的线程安全。

在多线程编程中,"atomic"操作通常被认为是一种细粒度的同步机制,用于保护共享数据的访问和修改。它们通常比其他同步机制(如锁)的开销更小,并且可以提供一定程度的线程安全性。

"atomic"操作的行为因编程语言和上下文而异,以下是一些常见情况和注意事项:

  1. 原子读取(Atomic Reads):"atomic"操作可以确保从共享变量中读取的值是最新的。这意味着一个线程在读取共享变量时,不会看到另一个线程修改变量后的旧值。
  2. 原子写入(Atomic Writes):"atomic"操作可以确保将值写入共享变量时的原子性。这意味着一个线程在写入共享变量时,不会被其他线程的读取或写入操作中断或干扰。
  3. 原子递增和递减(Atomic Increment/Decrement):某些编程语言提供原子递增和递减操作,以确保对共享计数器的操作是线程安全的。这些操作会在执行过程中阻止其他线程的干扰。

尽管"atomic"操作提供了一定的线程安全性,但在处理复杂的并发场景时,仍然需要考虑其他因素,如数据竞争、同步机制的选择和使用正确的内存模型等。此外,"atomic"操作并不能解决所有的线程安全问题,如死锁、竞争条件等。

因此,如果在特定的编程语言或框架中使用"atomic"操作,建议查阅相关文档和规范,以了解其具体行为和适用范围。同时,仍然需要谨慎设计和编写多线程代码,以确保整个程序的线程安全性。文章来源地址https://www.toymoban.com/news/detail-462009.html

到了这里,关于【JUC基础】10. Atomic原子类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 面试专题:java多线程(3)---关于 Atomic 原子类

    1.介绍一下Atomic 原子类Atomic     翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里  Atomic   是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰

    2024年02月07日
    浏览(57)
  • C++ 中的原子变量(std::atomic)使用指南

    原子变量( std::atomic )是C++中用于多线程编程的强大工具之一。它们提供了一种线程安全的方式来访问和修改共享数据,而无需使用显式的互斥锁。本文将介绍 std::atomic 的基本概念、使用方法、常见应用场景以及示例代码,适合入门级读者。 原子变量是一种特殊的数据类型

    2024年01月21日
    浏览(40)
  • 原子范数 Atomic norm最小化: 简单的Matlab例程

    基于 压缩感知的尽头: 原子范数最小化 中的原子范数最小化算法, 笔者做了一些matlab的仿真, 作为简单的例程,希望帮助大家进一步理解算法和自定义的拓展。 由于凸问题的求解需要使用 CVX, 因此需要读者先自行安装好 matlab 的 CVX包。 假设接收天线有 64 64 6 4 根, 有 3

    2023年04月08日
    浏览(89)
  • 【C++入门到精通】 原子性操作库(atomic) C++11 [ C++入门 ]

    当谈及并发编程时,确保数据的安全性和一致性是至关重要的。在C++11中引入的原子性操作库(atomic)为我们提供了一种有效且可靠的方式来处理多线程环境下的数据共享与同步问题。原子操作是不可分割的操作,它们可以确保在多线程环境中对共享数据的读写操作是原子的

    2024年02月03日
    浏览(38)
  • 并发编程-JUC-原子类

    JUC 整体概览 原子类 基本类型-使用原子的方式更新基本类型 AtomicInteger:整形原子类 AtomicLong:长整型原子类 AtomicBoolean :布尔型原子类 引用类型 AtomicReference:引用类型原子类 AtomicStampedReference:原子更新引用类型里的字段原子类 AtomicMarkableReference :原子更新带有标记位的引

    2024年02月21日
    浏览(39)
  • JUC并发编程之原子类

    目录 1. 什么是原子操作 1.1 原子类的作用 1.2 原子类的常见操作 原子类的使用注意事项 并发编程是现代计算机应用中不可或缺的一部分,而在并发编程中,处理共享资源的并发访问是一个重要的问题。为了避免多线程访问共享资源时出现竞态条件(Race Condition)等问题,J

    2024年02月13日
    浏览(44)
  • JUC并发编程学习笔记(十九)原子引用

    带版本号的原子操作! 解决ABA问题,引入原子引用(乐观锁思想) AtomicStampedReference类解决ABA问题 所有相同类型的包装类对象之间值的比较全部使用equals方法比较 Integer使用了对象缓存机制,默认范围是-128至127,推荐使用静态工厂方法valueOf获取对象实例,而不是new,因为v

    2024年02月05日
    浏览(55)
  • 《JUC并发编程 - 高级篇》05 -共享模型之无锁 (CAS | 原子整数 | 原子引用 | 原子数组 | 字段更新器 | 原子累加器 | Unsafe类 )

    有如下需求,保证 account.withdraw 取款方法的线程安全 原有实现并不是线程安全的 测试代码 执行测试代码,某次执行结果 5.1.1 为么不安全 withdraw 方法是临界区,会存在线程安全问题 查看下字节码 多线程在执行过程中可能会出现指令的交错,从而结果错误! 5.1.2 解决思路1

    2023年04月12日
    浏览(44)
  • 「JUC并发编程」初识CAS锁(概述、底层原理、原子引用、自旋锁、缺点)

    概述 CAS的全称为 Compare-And-Swap ,直译就是 对比交换 。是一条 CPU的原子指令 ,其作用是让CPU 先 进行比较两个值是否相等, 然后 原子地更新某个位置的值。经过调查发现,其实现方式是 基于硬件平台的汇编指令 ,就是说CAS是靠硬件实现的, JVM只是封装了汇编调 用,那些

    2024年02月16日
    浏览(49)
  • 如何理解鲁棒性?为什么robustness会翻译为鲁棒性?

    鲁棒性,英文为Robustness(承受故障和干扰的能力),是许多复杂系统(包括复杂网络)的关键属性。复杂网络的鲁棒性研究对许多领域都非常重要。本文着重介绍了鲁棒性的基本定义、命名起源、分类区别、提升方法和具体应用,供大家学习参考。 1. 鲁棒性的基本定义 鲁棒

    2024年01月19日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包