昨天晚上,遇上了阿里HR打电话来面试就聊了一下高并发情况下的冲突解决,结果我自己被绕晕了
原问题是:用CAS维持原子操作具体是如何操作的->这样操作有什么样的劣势->展示了一个实际的劣势场景:如何针对AtomicLong做优化
事实上并发问题是有一般解的,即:避免锁,减少锁范围,完全异步化(和我之前说高性能服务器的一般解是一样的)
CAS操作就不说了,一个自旋操作,高并发情况下可能会出现ABA问题,这些都是常见的面试题
那CAS实际的劣势呢,是在高并发操作下,写性能会急剧的降低(多个线程疯狂自旋,每个自旋周期都刚好被他人更新了值)
那为啥我会被绕晕了,其实他的真正问题是,在自旋锁的效应下,如何解决竟态写的性能下降问题,因此该问题不涉及读,而我脑子里面一直想的是AtomicLong.increaseAndGet()。。。。
这是有个解的,即是分线程加,类似于ConcurrentHashMap的处理方法,同理也可以预见到会发生和ConcurrentHashMap一样的sum操作会出现问题。当业务代码要马上获取自增的值时候,要么上锁,要么就得从业务上将读和写分开否则会使得业务代码在某次自增操作后获取到同一个值。
另,hashmap的负载因子的概念是:当hash发生时候,发生冲突的概率是多大