并发以及高并发

标题格

  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社区等公众号。

猜你喜欢

转载自www.cnblogs.com/AlmostWasteTime/p/10134991.html