做游戏视频去哪个网站好做网站多少
2026/1/10 2:23:16 网站建设 项目流程
做游戏视频去哪个网站好,做网站多少,汕头有几个区,做陌陌网站什么做文章目录1 前言#xff1a;从简单的计数器问题说起2 什么是CAS#xff1f;一个拍卖会的比喻3 CAS的底层原理#xff1a;从Java代码到CPU指令3.1 Java层面的CAS实现3.2 深入硬件#xff1a;CPU指令层面的实现4 CAS在Java中的应用场景4.1 原子类#xff1a;AtomicInteger等4…文章目录1 前言从简单的计数器问题说起2 什么是CAS一个拍卖会的比喻3 CAS的底层原理从Java代码到CPU指令3.1 Java层面的CAS实现3.2 深入硬件CPU指令层面的实现4 CAS在Java中的应用场景4.1 原子类AtomicInteger等4.2 自旋锁实现4.3 限流器中的CAS应用5 CAS的三大问题及解决方案5.1 ABA问题5.2 循环时间长导致CPU开销大5.3 只能保证一个变量的原子操作6 CAS与同步锁的性能对比7 实战经验与最佳实践7.1 选择合适的并发控制7.2 避免常见陷阱8 结语无锁编程的未来参考资料大家好我是你们的技术老友科威舟今天跟大家聊聊Java并发编程中的CAS原理。1 前言从简单的计数器问题说起想象一下你和几位朋友一起记录网站访问量每人面前都有一个计数器。每次有人访问网站你们需要同时增加计数器的值。如果使用传统的i方式很可能出现两人同时读取同一个值然后分别加1后写入导致实际计数少于应有值的情况。这就是典型的并发计数问题。在Java中我们可能会尝试用synchronized关键字解决这个问题但它像一把重量级锁会让其他线程阻塞等待性能开销较大。那么有没有更高效的方法呢这就是我们今天要介绍的CASCompare And Swap技术它堪称Java并发包的无名英雄。2 什么是CAS一个拍卖会的比喻CAS的全称是Compare And Swap比较并交换它是一种无锁算法用于在多线程环境下实现变量的原子性更新。想象一场拍卖会拍卖师宣布当前最高价是100元内存中的当前值。你举牌报价150元新值但在此之前需要确认是否有人已经出价超过100元。如果中间有人出价120元你的150元报价就需要基于120元重新计算。CAS操作就像这个过程查看当前值是否与预期值相同如果相同才更新为新值。CAS操作涉及三个基本操作数V要更新的变量内存地址A旧的预期值你认为当前应该的值B要设置的新值CAS的伪代码逻辑如下booleancompareAndSwap(intexpectedValue,intnewValue){if(memoryValueexpectedValue){memoryValuenewValue;returntrue;}returnfalse;}3 CAS的底层原理从Java代码到CPU指令3.1 Java层面的CAS实现在Java中CAS操作主要通过sun.misc.Unsafe类提供的方法实现JDK9推荐使用VarHandle。原子类AtomicInteger的incrementAndGet()方法正是基于CAS实现的publicfinalintincrementAndGet(){intprev,next;do{prevget();// 获取当前值nextprev1;// 计算新值}while(!compareAndSet(prev,next));// CAS更新returnnext;}3.2 深入硬件CPU指令层面的实现Java代码中的CAS操作最终会转换为底层CPU指令。在x86架构中对应的指令是cmpxchgcompare and exchange但仅仅这条指令还不足以保证原子性需要加上lock前缀来锁定总线或使用缓存锁定机制。完整的调用链是这样的// Java层Unsafe类unsafe.compareAndSwapInt(obj,offset,expect,update);// HotSpot虚拟机层C实现UNSAFE_ENTRY(jboolean,Unsafe_CompareAndSwapInt(...))__cmpxchg(...);// 调用CPU指令UNSAFE_END// 最终生成的汇编指令x86lock cmpxchg[内存地址],新值lock前缀的作用很关键确保对内存的读-改-写操作原子执行禁止指令重排序把写缓冲区中的所有数据刷新到内存中现代CPU使用缓存一致性协议如MESI协议来实现原子操作而不是简单粗暴地锁住整个总线这大大提高了性能。4 CAS在Java中的应用场景4.1 原子类AtomicInteger等Java的java.util.concurrent.atomic包提供了一系列原子类如AtomicInteger、AtomicLong、AtomicReference等。这些类都是基于CAS实现的。实战示例线程安全的计数器publicclassCASCounter{privateAtomicIntegercountnewAtomicInteger(0);publicvoidincrement(){count.incrementAndGet();}publicintgetCount(){returncount.get();}}4.2 自旋锁实现基于CAS可以实现一种简单的锁——自旋锁publicclassSpinLock{privateAtomicReferenceThreadsignnewAtomicReference();publicvoidlock(){ThreadcurrentThread.currentThread();// 如果锁未被占用则设置为当前线程占用while(!sign.compareAndSet(null,current)){// 循环等待直到获取到锁}}publicvoidunlock(){ThreadcurrentThread.currentThread();sign.compareAndSet(current,null);}}4.3 限流器中的CAS应用在令牌桶限流器中CAS可以用于安全地更新令牌数量如Eureka中的限流器实现。5 CAS的三大问题及解决方案尽管CAS很强大但它并非银弹也存在一些需要注意的问题。5.1 ABA问题问题描述假设变量X的值为A线程1准备将A改为C但在此期间线程2将A改为B然后又改回A。这时线程1执行CAS操作时会错误地认为X的值从未被修改过。这就像你离开会议室时有一杯水回来时还有一杯看似相同的水但可能已经被人喝过又重新倒满了。解决方案使用AtomicStampedReference为变量添加版本号AtomicStampedReferenceIntegeratomicRefnewAtomicStampedReference(1,0);// 初始值1版本号0int[]stampHoldernewint[1];intvalueatomicRef.get(stampHolder);booleansuccessatomicRef.compareAndSet(value,2,stampHolder[0],stampHolder[0]1);5.2 循环时间长导致CPU开销大问题描述在高竞争环境下CAS失败后会不断重试导致CPU空转消耗大量计算资源。解决方案限制重试次数超过阈值后采取其他策略使用Thread.yield()或LockSupport.parkNanos()让出CPUJVM的自适应自旋优化根据历史成功率动态调整自旋次数5.3 只能保证一个变量的原子操作问题描述CAS机制只能保证单个变量的原子性如果需要同时更新多个变量就无法直接使用CAS。解决方案使用锁机制如synchronized将多个变量封装成一个对象使用AtomicReferenceclassPair{intfirst,second;// 构造方法和getter/setter}AtomicReferencePairatomicPairnewAtomicReference(newPair(1,2));6 CAS与同步锁的性能对比在高并发环境下不同的同步机制性能表现各异实现方式耗时(ms)适用场景synchronized320高竞争场景代码简单ReentrantLock280需要高级功能如公平锁、条件变量CAS120低竞争场景追求高性能注测试数据为4线程执行100万次操作的情况推荐使用场景低竞争环境使用CAS避免线程阻塞高竞争环境使用synchronized或ReentrantLock减少CPU资源浪费7 实战经验与最佳实践7.1 选择合适的并发控制根据实际场景选择合适并发策略对于简单的计数器、状态标志优先考虑原子类对于复杂的复合操作可能需要使用锁机制考虑使用LongAdder替代AtomicLong在高并发环境下获得更好性能7.2 避免常见陷阱不要过度依赖CAS在极高竞争环境下CAS可能导致性能下降注意ABA问题在关键数据上使用带版本号的原子引用合理控制自旋次数避免无限循环导致CPU资源浪费8 结语无锁编程的未来CAS作为无锁编程的核心技术是现代高并发应用的重要基石。从Java并发包到数据库实现从分布式系统到操作系统内核CAS的思想无处不在。虽然直接使用Unsafe类存在风险JDK9已限制但通过Java标准库提供的原子类我们可以安全地享受CAS带来的性能优势。随着硬件技术的发展无锁编程将在高并发领域发挥越来越重要的作用。正如计算机科学中许多思想一样微观的CAS操作反映了宏观的分布式系统设计思想理解这些底层机制有助于我们在不同层次上设计出更高效、可靠的系统。参考资料https://blog.csdn.net/zj6182007/article/details/146300371https://blog.csdn.net/weixin_42201180/article/details/130714146https://blog.csdn.net/ltlt654321/article/details/127238736https://blog.csdn.net/m0_63080216/article/details/136203196https://blog.csdn.net/weixin_39528219/article/details/114231189https://blog.csdn.net/lki_suidongdong/article/details/106036918https://www.cnblogs.com/jingzh/p/15576771.htmlhttps://blog.csdn.net/qq_43001609/article/details/83590911https://blog.csdn.net/weixin_51786043/article/details/147445374本文在技术准确性的基础上通过比喻和实例力求生动易懂。如果您有任何问题或建议欢迎在评论区留言讨论。更多技术干货欢迎关注微信公众号科威舟的AI笔记~【转载须知】转载请注明原文出处及作者信息

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询