Java中的Atomic

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

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

    全部回复

    上滑加载中

    设置昵称

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

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

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