cas在java中是如何实现的?
cas通过调用JNI,通过借助c语言来调用cpu底层指令实现,以intel x86平台举例,最终映射的指令是cmpxchg 来实现比较并替换操作
cmpx如何保证多核心下的线程安全?
如果是多线程 系统会对总线加锁,只有一个线程可以对总线加锁成功,加锁成功后执行cas操作
cas存在的问题?
面临ABA问题,解决方法是加一个版本号
longAdder
对于cas操作当多线程高并发的请求的时候执行效率还是会受影响,这时longAdder就登场了
LongAdder中有一个base值 和一个cell数组 每个cell对象中持有一个Long值
base值是当没有冲突的时候 数值加到base上,或者cells扩容的时候数值加到base上
核心的方法是 longAccumulate()方法,
当cells数组为空的时候就创建一个长度为2的cell数组 并把值存入线程对应的cell
当cells数组不为空 线程对应的cell为空 就把cell存入数组对应的位置
当cells数组不为空 线程对应的cell也不为空 第一次会重试一次自旋 如果重试失败 会开启重试意向值 并rehash线程的hash值 然后自旋 如果自旋还失败 就进行扩容
扩容就是cells数组翻倍 并把旧值迁移