基于同步器的合并接口实现

本文介绍如何利用Java并发包中的AbstractQueuedSynchronizer(AQS)来优化高并发场景下的接口请求合并问题。通过自定义同步器,实现首个线程独占锁,后续线程共享锁并缓存结果,最后清理缓存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       在上篇《高并发下合并接口请求》中是简单的基于计数器来实现,每个线程都会以一定的时间(10毫秒)间隔检查是否有接口返回。其中的延时可以把间隔设置的非常小,但所有线程的调度还是有些浪费CPU资源。近两天看Tomcat源码时无意发现了一个叫AbstractQueuedSynchronizer的同步器,这个是JDK并发包下提供的工具类,如著名的ReentrantLock就是基于此实现。

       AbstractQueuedSynchronizer提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步类的基础框架。使用的方法是继承,子类通过继承同步器并需要实现它的方法来管理其状态,一般子类推荐被定义为自定义同步类的内部类。该同步器即可以作为排他模式也可以作为共享模式,当它被定义为一个排他模式时,其他线程对其的获取就被阻止,而共享模式对于多个线程获取都可以成功。

       同步器中FIFO队列的元素Node就是保存着线程引用和线程状态的容器,每个线程对同步器的访问,都可以看做是队列中的一个节点。当前线程如果获取不到锁,将当前线程构造成节点Node并加入sync队列尾,进入队列的每个线程都是一个节点Node,从而形成了一个双向队列。每个节点都是一个线程在进行自旋,判断依据就是自己是否是首节点的后继并且能够获资源,在释放时仅仅需要将资源还回去,然后通知一下后继节点并将其唤醒。

       AbstractQueuedSynchronizer已经实现了线程管理,只需要继承它实现一个自定义的同步器即可。该同步器特征为:同一并发时刻第一个线程为独占锁,后续线程为共享锁(共享第一个线程的执行结果),最后一个线程清除缓存结果。可以在同步器中加个计数器、缓存变量以及配合自身的状态来实现。

       当调用countUpOrAwait获取锁时,先计数器加1,并依次尝试获取共享锁、独占锁。获取共享只要判断下状态即可,这里的需求是合并接口调用,即使共享锁到独占锁过渡的时候,如果获取到了缓存数据则直接返回,如果获取的缓存数据为空则只要重试一次即可。主要是获取独占锁时要调用compareAndSetState来原子的尝试修改状态,锁状态定义3个值,分别是:1没有请求、0独占、-1共享。当独占线程执行完成后需调用setValue来把结果缓存到Sync中,这样一来也不用再单独定义一个缓存Map。最后就是调用countDown,计算数器减1并释放资源,如果是最后一个线程则还需清空关联的缓存变量。    

--------------------------------

相关代码为:synchplay/easyJCommon

为了更好的显示实战的效果,调高了电脑的分辨率,如果各位观看视频不清晰,请把电脑分辨率,调整大于或1440*900并且全屏观看 多线程大话西游2实战视频 第一章(基本设置) 1.游戏字库的提取与制作 2.多层窗口的句柄获取与使用 3.游戏后台绑定模式的查找与绑定 4.多窗口自动绑定的分析与实践(查找出所有主窗口,根据主窗口找出所有子窗口) 第二章(软件功能排版) 1.中控台的简单编写与多窗口绑定操作(上) 2.中控台的简单编写与多窗口绑定操作(下) 3.游戏主线的寻路判断分析与封装 4.游戏主线的对话几种方式分析与封装 5.游戏主线电影模式对话分析与封装l 第三章(基础功能) 1.回合制游戏的突发性战斗判断 2.回合制游戏自动打怪的几种方式分析 3.回合制游戏的捕抓怪物编写与封装 4.回合制游戏自动打怪程序编写与封装 第四章(日常任务) 1.回合制游戏环任务分析与接取 2.回合制游戏环任务接取与常用功能封装 3.回合制游戏环任务种类判断与寻路(上) 4.回合制游戏环任务种类判断与寻路(下) 5.回合制游戏跑环任务打怪功能 详细目录以视频为主 第五章(组队天庭任务) 1.补充第4章环任务代码说明 2.组队任务之领取任务 3.组队任务队长寻路及进入打怪 4.组队任务队员打怪及队长与队员分工 5.定时清理背包及防卡位思路 6.判断人物死亡及怪物死亡思路与补血蓝 详细目录以视频为主 百度云链接:http://pan.baidu.com/s/1miatcXq 密码:gqnh 下载地址: zygxlt.com/thread-42-1-1.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值