多线程并发安全计数器实现限流

目录:

  多线程并发安全计数器实现限流 :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

 

              

 

posted @ 2020-09-06 12:33  抽象Java  阅读(471)  评论(0编辑  收藏  举报