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

做企业网站联系群晖网站建设

做企业网站联系,群晖网站建设,汽车网址大全软件下载,旅游网站界面设计🧩 ​​一、CAS原理:图书馆占座的原子操作​​ ​​1. 核心机制(Compare And Swap)​​ ​​类比​​:图书馆唯一座位(​​内存地址V​​),你看到座位空着(​​期望值A…

🧩 ​​一、CAS原理:图书馆占座的原子操作​

​1. 核心机制(Compare And Swap)​
  • ​类比​​:图书馆唯一座位(​​内存地址V​​),你看到座位空着(​​期望值A​​),准备放书包占座(​​新值B​​)。若放包时座位仍空(V==A),占座成功;若已被占(V≠A),则放弃。
  • ​本质​​:CPU硬件指令(如x86的cmpxchg)保证比较+交换的​​原子性​​,Java通过Unsafe类封装。
  • ​代码示例​​:
    AtomicInteger seat = new AtomicInteger(0); // 座位状态:0=空,1=占// 尝试占座(无锁)
    boolean success = seat.compareAndSet(0, 1); 
    System.out.println("占座结果:" + success); // true
​2. 工作流程​
graph LRA[读取内存值V] --> B{是否等于期望值A?}B -->|是| C[更新为新值B]B -->|否| D[放弃操作]

⚠️ ​​二、ABA问题:座位被占两次的陷阱​

​1. 问题本质​
  • ​场景​​:
    线程1:座位空(A=0)→ 占座(B=1)
    线程2:座位被占(1)→ 清空(A=0)
    线程1:​​再次看到座位空(A=0)​​ → 误判无人用过 → 成功占座(实际已被他人使用过)。
  • ​风险​​:数据状态被​​隐形篡改​​,如银行余额重复扣款。
​2. 解决方案:加“版本号”​
  • ​类比​​:给座位贴标签(如日期),每次使用更新标签。
  • ​代码示例​​:
    AtomicStampedReference<Integer> seat = new AtomicStampedReference<>(0, 0); // 初始值=0,版本号=0// 第一次占座(版本号+1)
    seat.compareAndSet(0, 1, 0, 1); // 线程2尝试占座:虽然值=0,但版本号已变(预期版本0≠实际版本1)
    boolean success = seat.compareAndSet(0, 1, 0, 1); 
    System.out.println("占座结果:" + success); // false

📱 ​​三、Android中的应用场景​

​1. 全局计数器(无锁高性能)​
  • ​场景​​:统计App启动次数、按钮点击量。
  • ​优势​​:避免synchronized锁导致主线程卡顿。
  • ​代码示例​​:
    // MainActivity.kt
    val clickCount = AtomicInteger(0)fun onButtonClick() {val newCount = clickCount.incrementAndGet() // CAS自增runOnUiThread { tvCount.text = "点击次数: $newCount" }
    }
​2. 状态标记(轻量同步)​
  • ​场景​​:登录状态切换(如“未登录→登录中→已登录”)。
  • ​优势​​:比volatile更精确,比锁更高效。
  • ​代码示例​​:
    enum class LoginState { IDLE, LOADING, SUCCESS }val loginState = AtomicReference(LoginState.IDLE)fun startLogin() {if (loginState.compareAndSet(LoginState.IDLE, LoginState.LOADING)) {// 发起网络请求}
    }
​3. 资源池复用(避免ABA问题)​
  • ​场景​​:RecyclerView的ViewHolder复用池中,防止对象被回收后重新分配导致数据错乱。
  • ​代码示例​​:
    // ViewHolder复用池
    AtomicStampedReference<ViewHolder> holderRef = new AtomicStampedReference<>(null, 0);fun getViewHolder(): ViewHolder {int[] stampHolder = new int[1];ViewHolder holder = holderRef.get(stampHolder);if (holder != null) {// 使用前检查版本号,防止已被回收的Holder被复用if (holderRef.compareAndSet(holder, null, stampHolder[0], stampHolder[0])) {return holder;}}return createNewViewHolder();
    }

⚠️ ​​四、Android开发注意事项​

  1. ​避免主线程自旋​​:
    CAS失败时会自旋重试,若在主线程长时间自旋会导致ANR。解决方案:限制重试次数或切子线程。

    fun safeUpdate() {var retry = 0while (retry++ < 3) { // 限制重试3次if (atomicRef.compareAndSet(...)) return}// 仍失败则用Handler/LiveData异步处理
    }
  2. ​优先选择原子类​​:

    • AtomicInteger > synchronized:计数器场景性能提升10倍+
    • AtomicReference > volatile:多状态切换更安全
  3. ​内存敏感设备优化​​:
    AtomicFieldUpdaterAtomicInteger节省内存(不包装对象)。


💎 ​​总结​

  • ​CAS​​是Android高并发基石,用硬件指令实现无锁线程安全,适合计数器、状态机等场景。
  • ​ABA问题​​需用AtomicStampedReference(版本号)或AtomicMarkableReference(布尔标记)解决。
  • ​选型口诀​​:
    低竞争用原子类(AtomicInteger),  
    防ABA加版本号(AtomicStampedReference),  
    超高并发选分段(LongAdder)。

掌握CAS机制,能显著提升App并发性能与稳定性,尤其在列表滚动、高频点击等场景效果显著。

http://www.dtcms.com/a/434399.html

相关文章:

  • Java坐标转换的多元实现路径:在线调用、百度与高德地图API集成及纯Java代码实现——纯Java代码实现与数学模型深度剖析
  • 【socket编程中的常规操作,阻塞/非阻塞模式的差别】
  • 5G NR PDCCH DCI
  • 网站建设海淀区360浏览器打开是2345网址导航
  • 《代码随想录》二叉树专题算法笔记
  • CSS3 用户界面
  • 虚幻引擎UE5专用服务器游戏开发-32 使用Gameplay Tags阻止连招触发
  • 鼠标垫东莞网站建设网站建设公司的公司
  • SOAR技术与高效网络安全运营
  • Node.js 本地服务部署、常驻及调用完整笔记
  • Java 工具类 Hutool、Guava 与 Apache Commons 的区别
  • 怎么创建网站挣钱济南产品网站建设外包
  • BEV query 式图片点云视觉特征融合
  • 操作系统应用开发(十二)RustDesk 用户服务器搭建——东方仙盟筑基期
  • 将若依(RuoYi)项目创建为私有Gitee仓库的完整步骤
  • 网站上的百度地图标注咋样做app开发制作专业吗
  • TCP 协议核心面试题 (附答案详解)
  • Spring Security 实战:彻底解决 CORS 跨域凭据问题与 WebSocket 连接失败
  • Tabby下载安装与连接服务器
  • Apache Beam入门教程:统一批流处理模型
  • 计算机毕业设计 基于Hadoop的信贷风险评估的数据可视化分析与预测系统 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
  • 【QT常用技术讲解】QTablewidget单元格存储隐藏的数据
  • K8s学习笔记(九) job与cronjob
  • MATLAB线性代数函数完全指南
  • 关于单片机外设存储芯片的应用笔记(IIC驱动)
  • 梅州网站建设南宁网站 制作
  • 2015 年真题配套词汇单词笔记(考研真相)
  • 中国建设银行舟山分行网站网站构建的过程
  • python如何通过链接下载保存视频
  • K-Lite Mega/FULL Codec Pack(视频解码器)