当前位置: 首页 > wzjs >正文

桃园街网站建设整合营销策划

桃园街网站建设,整合营销策划,郑州网站如何制作,logo标志目录 1 AtomicLong 1.1 核心功能 1.2 实现原理: (1)基于 Unsafe 的底层操作 (2) volatile字段的内存可见性 (3)CAS 操作与 ABA 问题 1.3 性能分析 1.4 使用场景 2 LongAdder 核心设计原理 1 分段存储 2 分散更新策略 3.处理高竞…

目录

1 AtomicLong

1.1 核心功能

1.2 实现原理:

(1)基于 Unsafe 的底层操作

(2) volatile字段的内存可见性

(3)CAS 操作与 ABA 问题

1.3 性能分析

1.4 使用场景

2 LongAdder

核心设计原理

1 分段存储

2 分散更新策略

3.处理高竞争


1 AtomicLong

AtomicLong 是一个基于 CAS操作的原子类,用于在多线程环境下对 long 类型变量进行无锁的原子性操作。它通过底层的 Unsafe 类实现高效的原子更新,解决传统 synchronized 关键字带来的性能开销问题。

1.1 核心功能

AtomicLong 支持以下原子操作:

方法

功能

实现原理

add(long delta)

原子性地将变量增加 delta

CAS 操作

incrementAndGet()

原子性自增 1 并返回新值

add(1L)

decrementAndGet()

原子性自减 1 并返回新值

add(-1L)

getAndAdd(long delta)

原子性增加 delta

并返回原值

CAS 操作

getAndSet(long newValue)

原子性设置新值并返回原值

CAS 操作

compareAndSet(long expect, long update)

原子性将值从 expect

更新为 update

(如果相等)

CAS 操作

get()

获取当前值(非原子,但保证可见性)

直接读取 value 字段

1.2 实现原理:

(1)基于 Unsafe 的底层操作

AtomicLong 的所有原子方法均通过 sun.misc.Unsafe 类的底层原生指令实现,例如:

objectFieldOffset:获取long value字段在对象内存中的偏移量

getAndAddLong:通过CPU的CAS指令(如 cmpxchgq)原子性更新内存中的值。

(2) volatile字段的内存可见性

AtomicLongvalue 字段声明为 volatile ,确保一个线程的修改对其它线程可见:

(3)CAS 操作与 ABA 问题

  • CAS 操作

CAS(Compare-And-Swap)包含三个步骤:

  1. 比较:读取内存中的旧值 expect
  2. 交换:如果旧值等于 expect,则将新值 update 写入内存;否则不操作。
  3. 返回结果:返回内存中的旧值。
  • ABA 问题
  • 场景:变量从 A → B → A,此时 compareAndSet(A, C) 会错误地认为值未变,导致更新失败。
  • 解决方案
    • AtomicStampedReference:引入版本戳(stamp)标记变量的修改次数,解决 ABA 问题。
    • LongAdder:通过分散更新压力避免单一变量的频繁 CAS 冲突。

1.3 性能分析

优势

  • 无锁操作:避免线程阻塞和上下文切换,性能优于 synchronized
  • 读写高效:get() 方法是非原子的,但保证内存可见性,读取速度极快。
  • 适用场景:低到中等并发场景,如计数器、单变量累加器。

局限性

  • 高并发瓶颈:当多个线程激烈竞争同一变量时,CAS 失败次数剧增,导致自旋开销(spin-wait)。
  • ABA 问题:需额外处理或改用 AtomicStampedReference

1.4 使用场景

低竞争环境:如单机多线程的计数器、序列号生成。

需要强原子性保证:如银行账户扣款、分布式锁的版本控制。

2 LongAdder

设计目标LongAdder是Java 8引入的原子类,属于 java.util.concurrent.atomic 包,专为高并发场景下的累加操作优化。它的核心目标是解决AtomicLong 在及极高并发下的性能瓶颈——通过分散压力来减少线程间的CAS冲突。

核心设计原理

1 分段存储

  • cells数组: LongAdder维护一个动态增长的long[]cells数组,每个元素成为一个cell,用于存储部分累加值。
  • base变量:所有cell之外的累加值存储在base中,默认情况下,单个线程的增量优先base,当base发生竞争时,才会分配新的cell。

2 分散更新策略

  1. 优先更新 base(①):
    1. cells 未初始化(null),或通过 casBase 成功将 base 加上 x,直接返回。casBaseStriped64 提供的原子操作,用于更新 base
  2. 处理 cells 分段(②-④):
    1.  哈希索引计算getProbe() 返回与当前线程绑定的哈希值(通过 ThreadLocalRandom 生成),并与数组长度掩码按位与,得到目标 cell 的索引。
    2. CAS 更新 cell:若目标 cell 为空,通过 casCell 初始化为新值;否则尝试原子性增加 cell 的值。
    3. 竞争标记:若 CAS 失败(uncontended = false),表示存在线程竞争。

3.处理高竞争

调用 longAccumulate 方法,可能触发以下操作:

  • 动态扩容:若 cells 数组过小,倍增其大小并将 base 值分布到新 cell 中。
  • 批量写入:将当前线程的增量暂存到临时变量,直到找到可写入的 cell。
public void add(long x) {Cell[] as; long b, v; int m; Cell a;if ((as = cells) != null || !casBase(b = base, b + x)) { // ① 优先尝试更新 baseboolean uncontended = true;if (as == null || (m = as.length - 1) < 0 || // ② 处理未初始化或空数组(a = as[getProbe() & m]) == null ||     // ③ 计算哈希索引并获取目标 cell!(uncontended = a.cas(v = a.value, v + x))) { // ④ CAS 更新 celllongAccumulate(x, null, uncontended); // ⑤ 处理竞争,触发动态扩容}}
}

sum方法:返回base值和cells数组的总和

public long sum() {Cell[] as = cells; Cell a;long sum = base;if (as != null) {for (int i = 0; i < as.length; ++i) {if ((a = as[i]) != null)sum += a.value;}}return sum;
}

reset方法:重置变量,使总和保持为零。

此方法可能是创建新 adder 的有用替代方法,但仅在没有并发更新时有效。由于此方法本质上是 racy,因此仅当已知没有线程同时更新时,才应使用它。

public void reset() {Cell[] as = cells; Cell a;base = 0L;if (as != null) {for (int i = 0; i < as.length; ++i) {if ((a = as[i]) != null)a.value = 0L;}}
}

sumThenReset方法:返回当前总和后清零,适用于离线统计场景

实际上等效于 sum 后跟 reset。例如,在多线程计算之间的 static points 期间,此方法可能适用。如果存在与此方法并发的更新, 则不能保证 返回的值是重置之前出现的最终值。

public long sumThenReset() {Cell[] as = cells; Cell a;long sum = base;base = 0L;if (as != null) {for (int i = 0; i < as.length; ++i) {if ((a = as[i]) != null) {sum += a.value;a.value = 0L;}}}return sum;
}
http://www.dtcms.com/wzjs/355791.html

相关文章:

  • asp网站建设制作个人网站设计欣赏
  • 人社局网站建设seo的优缺点
  • wordpress升级福清seo
  • 宣讲家网站两学一做心得体会提高工作效率的工具
  • 网站建设沟通准备长尾关键词排名推广
  • 开发公司垫付拆迁款后未取得土地纠纷优化营商环境 提升服务效能
  • 商城网站开发公司沧州百度推广总代理
  • 网站服务器安装教程视频核心关键词
  • 中国菲律宾冲突岛屿优化大师怎么提交作业
  • wordpress 公众号采集器河南网站优化排名
  • wordpress同步腾讯微博5年网站seo优化公司
  • 成都网站设计师陕西整站关键词自然排名优化
  • icon psd下载网站安卓内核级优化神器
  • 重庆网站推广优化游戏代理是怎么赚钱的如何代理游戏
  • 建设国际互联网网站百度竞价个人开户
  • 医疗器械查询网站更换服务器对seo的影响
  • 重庆有效的网站推广观看b站的广告网站平台
  • 大连百度推广优化爱站网seo培训
  • 网页设计与网站开发第三版课后答案电话号码宣传广告
  • 在网站里怎么做图片超链接百度网址大全怎么设为主页
  • 杭州鼎易科技做网站太坑网络推广公司深圳
  • 怎么做国外游戏下载网站百度新闻头条新闻
  • 中山网站建设技术西安seo服务培训
  • 律师论坛网站模板app有哪些推广方式
  • 幻灯片网站源码怎么在网络上推广
  • 网站的制作百度关键词权重查询
  • 万维网域名注册网站百度网
  • 网站前台设计方案seo竞价培训
  • 北京网站建设技术部网络营销方案案例范文
  • 做php网站用的软件沈阳百度推广优化