122原子性操作的一些记录
1、i++javap后的指令码,分别为操作数栈内 堆内存取i, 存入常量1,执行加法,写回堆内存多步操作。非原子性,会有线程问题。
处理办法,加锁(synchronize,ReentrantLock)或者atomicInteger。 或者使用cas(compare and swap)操作(-硬件同步原语)
2、cas自旋:cas操作失败后,继续重试整个过程。cas的java执行,Unsafe(需要反射调用)。CompareAndSwapXX
偏移量:修改对象堆内存内部的地址偏移--通过反射获去Field,使用unsafe的objectFieldOffset获取对应的偏移量。--然后getXXvolatile获取值。
3、J.U.C java.util.concurrent包
4、 atomicXX-->cas操作
5、atomicXXFieldUdadater:更新已经存在没有atomic修饰的字段 -- volatile
6、atomicReference<T>,原子修改引用-compareAndSet
7、DoubleAccumulator、LongAccumulator、DoubleAdder、LongAdder:内部拆分多个数同步计算,适合多改少读的场景。Accmulator可以传入lambda自定义计算逻辑。
cas自旋的问题:高频争抢cpu资源,大量长时间的不成功,大量消耗cpu资源。
仅支持单个变量
ABA问题-----线程a内反复修改,导致本应失败的b线程cas成功。
atomicstampedreference:除了对比值,还会对比version防止aba问题。
实现一个简单锁:AtomicReference<Thread> run 标记当前获取到锁的线程。 定义个队列 如linkedblockingqueue,保存等待线程,集成Lock接口LockSupport.park() ;
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性