一、在高并发场景下,CAS修改数据有什么问题?有什么优化方案?

性能问题,因为cas会导致大量线程空循环,导致cpu飙高。
优化方案:
任务拆解、不同线程进行不同的任务,最后将结果汇总,充分利用线程。例如:累加操作,进行分段操作。
java1.8使用LongAdder就是利用上述方案,对Atomic类实现优化。
AtomicLong中有个内部变量value保存着实际的long值,所有的操作都是针对该变量进行。也就是说,高并发环境下,value变量其实是一个热点,也就是N个线程竞争一个热点。
LongAdder的基本思路就是分散热点,将value值分散到一个数组中,不同线程会命中到数组的不同槽中,各个线程只对自己槽中的那个值进行CAS操作,这样热点就被分散了,冲突的概率就小很多。如果要获取真正的long值,只要将各个槽中的变量值累加返回

对于AtomicLong,最终结果的计算始终是下面这个形式:
value = 10 + 10 + 10 = 30
对于LongAdder来说,内部有一个base变量,一个Cell[]数组。
base变量:非竞态条件下,直接累加到该变量上
Cell[]数组:竞态条件下,累加个各个线程自己的槽Cell[i]中
最终结果的计算是下面这个形式:
疑难杂问 - 图1
LongAdder实现原理:https://segmentfault.com/a/1190000015865714