原子类型AtomicLong用法探究

简介: AtomicLong 是 Java 提供的一个原子长整型类,提供了对长整型数据的原子性操作。在多线程环境下,AtomicLong 可以确保对长整型数据的操作是线程安全的。

AtomicLong探究

AtomicLong 是 Java 提供的一个原子长整型类,提供了对长整型数据的原子性操作。在多线程环境下,AtomicLong 可以确保对长整型数据的操作是线程安全的。


在 Android 中,AtomicLong 的使用方法和功能与标准 Java 中的 AtomicLong 相同。你可以通过以下方式创建一个 AtomicLong 对象:

AtomicLong atomicLong = new AtomicLong(initialValue);

上述代码,initialValueAtomicLong 对象的初始值。


一旦创建了 AtomicLong 对象,你可以使用以下方法对其进行操作:


  • get():获取当前的值。
  • set(long newValue):设置新的值。
  • getAndSet(long newValue):获取当前的值并设置新的值。
  • compareAndSet(long expect, long update):如果当前值等于 expect,则将值设置为 update
  • getAndIncrement():获取当前的值并增加 1。
  • getAndDecrement():获取当前的值并减少 1。
  • incrementAndGet():增加当前的值并获取新的值。
  • decrementAndGet():减少当前的值并获取新的值。


这些方法都提供了对 AtomicLong 对象的原子性操作,确保在多线程环境下的数据安全性。


AtomicLong 的 Android 代码示例:

import java.util.concurrent.atomic.AtomicLong;  
public class MyAtomicLong {  
    private static AtomicLong counter = new AtomicLong(0);  
    public static void main(String[] args) {  
        // 创建两个线程同时执行操作  
        Thread thread1 = new Thread(new MyRunnable());  
        Thread thread2 = new Thread(new MyRunnable());  
        thread1.start();  
        thread2.start();  
    }  
    private static class MyRunnable implements Runnable {  
        @Override  
        public void run() {  
            // 每次递增 1  
            long value = counter.incrementAndGet();  
            System.out.println("Value: " + value);  
        }  
    }  
}

在这个示例中,我们创建了一个 AtomicLong 对象 counter,并使用 incrementAndGet() 方法对其进行递增操作。然后,我们创建两个线程并启动它们,同时对 counter 进行操作。由于 AtomicLong 的原子性操作,我们可以在多线程环境下安全地递增 counter,避免了竞态条件的问题。

AtomicLong和LongAddr区别

AtomicLong 是基于 CAS 方式自旋更新的;LongAdder 是把 value 分成若干cell,并发量低的时候,直接 CAS 更新值,成功即结束。


并发量高的情况,CAS更新某个cell值和需要时对cell数据扩容,成功结束;更新失败自旋 CAS 更新 cell值。


取值的时候,调用 sum() 方法进行每个cell累加。 AtomicLong 包含有原子性的读、写结合的api;LongAdder 没有原子性的读、写结合的api,能保证结果最终一致性。 低并发场景AtomicLong 和 LongAdder 性能相似,高并发场景 LongAdder 性能优于 AtomicLong。

相关文章
|
SQL 缓存 分布式计算
SparkSQL与Hive metastore Parquet转换
Spark SQL为了更好的性能,在读写Hive metastore parquet格式的表时,会默认使用自己的Parquet SerDe,而不是采用Hive的SerDe进行序列化和反序列化
SparkSQL与Hive metastore Parquet转换
|
3月前
|
数据采集 存储 JSON
京东商品详情 API 实战总结(技术复盘)
本文为京东商品详情API实战复盘,聚焦后端开发落地:基于合规封装接口(如Taobaoapi2014),通过jd.item_get实现自营/第三方商品全维度采集,涵盖基础信息、价格库存、图文素材及口碑数据;攻克签名校验、限流、区域差异等难点,优化调度与容错,保障企业级稳定调用。(239字)
|
传感器 存储 边缘计算
定位与专长的分野:ThingsBoard 物联网平台与 MyEMS 能源管理系统的深度对比
ThingsBoard 与 MyEMS 是两款数据驱动的开源技术平台,分别聚焦物联网全域管理与能源垂直领域。前者以泛在物联为核心,具备设备接入、规则引擎、可视化与多租户管理能力,适用于智慧城市、工业物联网等场景;后者专注能源管理,提供能源数据治理、能效优化与碳排分析功能,广泛应用于制造、建筑与新能源场景。两者在技术架构与应用场景上各具特色,分别体现了“广度连接”与“深度专精”的技术路径。
453 2
|
存储 缓存 弹性计算
聚宽揭秘:为什么量化研究员喜欢在Kubernetes上使用Fluid简化数据管理?
在量化投研过程中,通过引入阿里云的 ack-fluid 技术,基于 JindoRuntime 的分布式缓存加速,解决了多数据源、弹性扩展、动态挂载等挑战,显著提升了数据处理效率和资源利用率,降低运营成本。
|
移动开发 定位技术 HTML5
H5 获取手机GPS坐标
H5 获取手机GPS坐标
|
SQL Java 数据库
Transactional注解讲解及使用
事务是数据库操作的一组集合,它作为一个工作单元,要求所有操作要么全部成功,要么全部失败。事务的四个基本特性是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
|
JSON 前端开发 JavaScript
前端Ajax、Axios和Fetch的用法和区别笔记
前端Ajax、Axios和Fetch的用法和区别笔记
658 2
|
缓存 数据库 索引
everything 本地文件搜索工具 完胜WIndows搜索 速度99% 超级给力
everything 本地文件搜索工具 完胜WIndows搜索 速度99% 超级给力
598 1
|
Java 数据处理
Java8的新特性parallelStream()的概念、对比线程优势与实战
parallelStream() 是 Java 8 中新增的一个方法,它是 Stream 类的一种扩展,提供了将集合数据并行处理的能力。普通的 stream() 方法是使用单线程对集合数据进行顺序处理,而 parallelStream() 方法则可以将集合数据分成多个小块,分配到多个线程并行处理,从而提高程序的执行效率。
1288 3
|
小程序 Java 编译器
性能工具之JMeter 微信小程序 WebSocket 脚本入门
【5月更文挑战第12天】性能工具之JMeter 微信小程序 WebSocket 脚本入门
758 1

热门文章

最新文章