java Atomic原理图文

举报
赵KK日常技术记录 发表于 2023/06/25 11:14:38 2023/06/25
【摘要】 Java中的Atomic类是Java.util.concurrent包提供的一组原子操作类,这些类提供了线程安全的基本数学和逻辑运算。​ Atomic原理在多线程编程中,由于多个线程同时访问共享资源,例如变量、数据结构等,会引发线程安全问题。为了解决这些问题,Java提供了两种方式:synchronized关键字和Lock接口。然而,在高并发场景下,使用synchronized和Lock可能...

Java中的Atomic类是Java.util.concurrent包提供的一组原子操作类,这些类提供了线程安全的基本数学和逻辑运算。

请在此添加图片描述

请在此添加图片描述

Atomic原理

在多线程编程中,由于多个线程同时访问共享资源,例如变量、数据结构等,会引发线程安全问题。为了解决这些问题,Java提供了两种方式:synchronized关键字和Lock接口。

然而,在高并发场景下,使用synchronized和Lock可能会导致性能瓶颈,因为它们都需要让线程排队来获得锁。

在这种情况下,可以使用Java Atomic类,它们使用CPU级别的指令来保证操作的原子性,并且不需要使用锁机制,因此它们通常比synchronized和Lock更加高效。

Atomic类提供的操作是原子性操作,具有以下特点:

  • 原子性:整个操作是仅有的一个原子操作,不会被其他线程干扰。
  • 可见性:每个线程对变量的修改对其他线程可见。
  • 有序性:程序执行的顺序按照代码的先后顺序。

技术文档

请在此添加图片描述

原子类型

请在此添加图片描述

Java Atomic类提供了以下4种原子类型:

  • AtomicInteger:原子整型
  • AtomicLong:原子长整型
  • AtomicBoolean:原子布尔值
  • AtomicReference:原子对象引用

成员方法

请在此添加图片描述

请在此添加图片描述

请在此添加图片描述

Atomic类的主要成员方法如下:

  • get()和set()方法:用于获取和设置值。
  • addAndGet()和getAndAdd()方法:用于原子地增加或减少值,并返回新值。
  • compareAndSet()方法:如果当前值等于预期值,则原子地将其设置为新值,可以用于实现乐观锁。
  • incrementAndGet()和getAndIncrement()方法:用于原子地增加或减少值,并返回新值。

代码示例

以下是一个使用AtomicInteger类的简单示例:

import java.util.concurrent.atomic.AtomicInteger;

public class Counter {
    private final AtomicInteger count = new AtomicInteger(0);

    public int getCount() {
        return count.get();
    }

    public void increment() {
        count.incrementAndGet();
    }

    public void decrement() {
        count.decrementAndGet();
    }
}

在上面的例子中,我们创建了一个Counter类,该类使用AtomicInteger来实现线程安全的计数器。increment()和decrement()方法分别增加和减少计数器的值,由于它们使用AtomicInteger类的原子操作,因此它们对于多个线程是线程安全的。

请在此添加图片描述

请在此添加图片描述

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

public class ConcurrentHashMapWithAtomicDemo {
    private final ConcurrentHashMap<String, AtomicInteger> concurrentHashMap = new ConcurrentHashMap<>();

    public void increment(String key) {
        AtomicInteger value = concurrentHashMap.get(key);
        if (value == null) {
            AtomicInteger newValue = new AtomicInteger(1);
            value = concurrentHashMap.putIfAbsent(key, newValue);
            if (value == null) {
                value = newValue;
            }
        } else {
            value.incrementAndGet();
        }
    }

    public int getCount(String key) {
        AtomicInteger value = concurrentHashMap.get(key);
        return (value == null) ? 0 : value.get();
    }
}

在上面的示例中,我们创建了一个ConcurrentHashMapWithAtomicDemo类,该类使用ConcurrentHashMap类和AtomicInteger类来实现线程安全的计数器。increment()方法增加对给定键值的计数器,getCount()方法获取给定键值的计数器。

在increment()方法中,我们首先从ConcurrentHashMap中获取原子整数,然后检查其是否为空。如果为空,则我们创建一个新的原子整数并使用putIfAbsent()方法将其放入ConcurrentHashMap,此方法可以确保原子地将键值对添加到ConcurrentHashMap中。在这种情况下,我们将新值设为1。

如果原子整数不为空,则我们增加其计数器。

在getCount()方法中,我们从ConcurrentHashMap获取原子整数,并返回它的当前值。如果原子整数不存在,则返回0。

使用Java Atomic类结合ConcurrentHashMap类来实现线程安全的计数器,可以处理高并发环境下的计数问题。ConcurrentHashMap提供了线程安全的Hash表操作,而Atomic类可以保证对计数器的更新是原子性的。

结论

Java Atomic类提供了一组非常有用的功能,可以在高并发环境下解决线程安全问题。它们比传统的同步机制更加高效,因此可以提高程序的性能。如果你需要在多线程应用程序中处理共享变量,可以尝试使用Java Atomic类来提高程序的性能和可靠性。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。