Java LongAdder工作原理及实例分析如何实现?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2865个文字,预计阅读时间需要12分钟。
LongAdder通过模拟多个计数器,将多个线程的累加操作分散到不同的计数器上,从而减少了对单个变量的竞争。这种方法可以显著降低在高并发情况下CAS操作的失败率,并避免由于自旋状态导致的CPU资源浪费,提高了并发性能。
与AtomicLong相比,LongAdder在处理高并发场景时性能更优,因为它避免了过多的线程竞争同一个变量导致的CAS失败。AtomicLong在多线程同时访问时,每个线程都会尝试更新同一个变量,这会增加失败的概率,尤其是在高并发情况下。而LongAdder通过分散负载,减少了线程间的竞争,从而提高了整体的性能。
LongAdder实现原理图
高并发下N多线程同时去操作一个变量会造成大量线程CAS失败,然后处于自旋状态,导致严重浪费CPU资源,降低了并发性。既然AtomicLong性能问题是由于过多线程同时去竞争同一个变量的更新而降低的,那么如果把一个变量分解为多个变量,让同样多的线程去竞争多个资源。
LongAdder则是内部维护一个Cells数组,每个Cell里面有一个初始值为0的long型变量,在同等并发量的情况下,争夺单个变量的线程会减少,这是变相的减少了争夺共享资源的并发量,另外多个线程在争夺同一个原子变量时候,如果失败并不是自旋CAS重试,而是尝试获取其他原子变量的锁,最后当获取当前值时候是把所有变量的值累加后再加上base的值返回的。
LongAdder维护了要给延迟初始化的原子性更新数组和一个基值变量base数组的大小保持是2的N次方大小,数组表的下标使用每个线程的hashcode值的掩码表示,数组里面的变量实体是Cell类型。
本文共计2865个文字,预计阅读时间需要12分钟。
LongAdder通过模拟多个计数器,将多个线程的累加操作分散到不同的计数器上,从而减少了对单个变量的竞争。这种方法可以显著降低在高并发情况下CAS操作的失败率,并避免由于自旋状态导致的CPU资源浪费,提高了并发性能。
与AtomicLong相比,LongAdder在处理高并发场景时性能更优,因为它避免了过多的线程竞争同一个变量导致的CAS失败。AtomicLong在多线程同时访问时,每个线程都会尝试更新同一个变量,这会增加失败的概率,尤其是在高并发情况下。而LongAdder通过分散负载,减少了线程间的竞争,从而提高了整体的性能。
LongAdder实现原理图
高并发下N多线程同时去操作一个变量会造成大量线程CAS失败,然后处于自旋状态,导致严重浪费CPU资源,降低了并发性。既然AtomicLong性能问题是由于过多线程同时去竞争同一个变量的更新而降低的,那么如果把一个变量分解为多个变量,让同样多的线程去竞争多个资源。
LongAdder则是内部维护一个Cells数组,每个Cell里面有一个初始值为0的long型变量,在同等并发量的情况下,争夺单个变量的线程会减少,这是变相的减少了争夺共享资源的并发量,另外多个线程在争夺同一个原子变量时候,如果失败并不是自旋CAS重试,而是尝试获取其他原子变量的锁,最后当获取当前值时候是把所有变量的值累加后再加上base的值返回的。
LongAdder维护了要给延迟初始化的原子性更新数组和一个基值变量base数组的大小保持是2的N次方大小,数组表的下标使用每个线程的hashcode值的掩码表示,数组里面的变量实体是Cell类型。

