标题格
1、如何对每秒上千场景下的分布式锁高并发优化
2、并发问题的AQS理解
1、如何对每秒上千场景下的分布式锁高并发优化
如果对一个商品不加锁,就可能出现库存超卖的情况(库存15,2个用户各买10个,没有锁的情况可能出现-5的最终库存)。所以我们可以用:4
悲观锁、乐观锁、分布式锁、队列串行化、异步队列分散、Redis原子操作等等...
现在限定了分布式锁,有个问题:如果一套请求-下单需要20毫秒,1秒就只能容许50个用户对商品的排队等候情况(分布式锁),不能做到每秒上千场景。
解决方法:首先理解Java的ConcurrentHashMap的源码和底层原理,核心就是分段加锁。所以我们可以把1000个商品分成20段库存,客户端
1000个请求进服务端的时候,随机分给20段库存,每个分段各自加锁执行...但是某个下单请求,加锁后发现分段库存不足。那么必须释放锁,换以一个分段库存,再测尝试加锁处理。
这个方法主要缺点就是太复杂。
2、并发问题的AQS理解
AQS(AbstractQueuedSynchronizer,抽象队列同步器)是Java并发包的基础类。ReentrantLock,加锁和解锁的核心组件(ReentrantLock lock = new ReentrantLock() lock.lock();加锁 lock.unlock() 解锁)。
AQS对象内部有个变量state(int类型)代表加锁对象,初始值0(加锁状态值=1)。AQS还有个关键变量,记录当前加锁的是哪个线程,初始值null。
AQS还有一个等待队列,专门放加锁失败的线程(CAS机制加锁机制)。
一句话总结:就是一个并发包的基础核心组件,实现各种锁,各种同步组件的。
参考:纯洁的微笑、石杉的架构笔记、java版web项目、架构师之路、springForAll社区等公众号。