💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 1. CAS 全称 CompareAndSwap cpu并发原语 AtomicInteger CAS =》UnSafe =》 CAS底层思想=》ABA问题 =》原子引用更新=》避免ABA问题 ## 1.1 比较并交换 CompareAndSet 线程拿到的值和主内存中的值一致, 就将要写入的值写入到主内存,否则就修改失败。 ## 1.2 CAS 底层原理?如果知道,谈谈你对UnSafe的理解? 使用 Java中的sun.misc.Unsafe 类 这个类的方法都是native的,完全依赖于硬件的功能,通过它实现了原子操作。CAS是一条CPU的原子指令,执行是连续的,执行过程中不允许被打断,不会造成数据不一致问题。 ## 1.3 CAS 缺点 ### 1.3.1 循环时间长开销很大 如果CAS失败,会一直进行尝试自旋(do while 方式),如果长时间不成功,会一直循环,对cpu影响大。 ### 1.3.2 只能保证一个共享变量的原子操作 ### 1.3.3 ABA问题 T1 T2 俩个线程从主内存中都拿到的变量是A,T1比较慢,T2 把A改成了B,并写入到主内存,又来了个T3,拿到主内存 B并改成A写入到主内存,这时候T1执行完成值改为了1,发现主内存还是A和自己当时拿到的值一致,就将1写入主内存成功。但是实际上主内存的值已经从出现过A=》B=》A的过程。就是一个线程往主内存写入数据时,发现主内存中的值和线程当时拿到的值是相同的,符合CAS的逻辑,但是实际上主内存中的这个值已经修改过多次,只能当这个线程去写入时,刚好和线程当时拿到的值一致。中间过程中值可能已经被改动过了。 #### ABA 解决方式 版本号,修改一次版本号就增加一次。比如 elasticsearch 中数据每更新一次,版本号字段就加一