多线程并发安全计数器实现限流
目录:
多线程并发安全计数器实现限流 :https://www.cnblogs.com/Jomini/p/13621330.html
多线程并发安全计数器实现限流 (一) 简单实现 :https://www.cnblogs.com/Jomini/p/13621757.html
多线程并发安全计数器实现限流 (二) 使用 J.U.C中的AtomicInteger实现计数器 : https://www.cnblogs.com/Jomini/p/13621952.html
多线程并发安全计数器实现限流 (三) 加锁实现计数器 :https://www.cnblogs.com/Jomini/p/13621964.html
多线程并发安全计数器实现限流 (四) CAS :https://www.cnblogs.com/Jomini/p/13623366.html
一、面试出题背景
结合项目问
接口 --- 用到数据库资源
技术功能: 限制 --- 某一个接口方法,并发访问数量【限流】
应用场景: Zuul, Spring Cloud网关, Nginx, 普通controller接口
请求:tomcat ---> 线程池 ----> 线程 ----> Spring servlet核心分发器
限流的本质:计数器的实现
简单实现:https://www.cnblogs.com/Jomini/p/13621757.html
如何实现一个多线程并发安全计数器
低阶面试:
1、J.U.C 并发编程工具包 - 原子操作封装类 Atomic Integer :https://www.cnblogs.com/Jomini/p/13621952.html
2、加锁 : https://www.cnblogs.com/Jomini/p/13621964.html
高阶面试:
1、使用 Atomic Integer 和 加锁 用哪种
1.1、使用锁 - synchronized
面试官:不建议使用
不建议使用锁的理由:锁的添加和释放会带来线程的切换,操作系统的调度
理由:没抢到锁 ---- BLOCKED 等多久
Java 线程状态,线程切换,操作系统线程调度, 时间片概念
导致 原本速度很快的代码,由于状态切换,线程上下文切换,而变慢
线程一释放锁后,线程二不一定马上执行执行代码块,线程二可能在执行系统的调度
1.2、使用 - AtomicInteger
由于使用 锁 耗时较长,所以使用 atomic Integer
AtomicIntege 本质是 使用 CAS 机制 : https://www.cnblogs.com/Jomini/p/13623366.html
unsafe --- >
1、反射获取对象
2、CAS 操作内存
JVM 运行时,数据区
github:https://github.com/szjomin/CounterDemo