从零并发框架(三)异步转同步注解+字节码增强代理实现
序言上一节我们学习了异步查询转同步的 7 种实现方式 , 今天我们就来学习一下 , 如何对其进行封装 , 使其成为一个更加便于使用的工具 。
思维导图如下:
文章插图
异步转同步字节码增强
拓展阅读java 手写并发框架(一)异步查询转同步的 7 种实现方式
java 手写并发框架(二)异步转同步框架封装锁策略
java 手写并发框架(三)异步转同步框架注解和字节码增强
异步转同步的锁调用同步锁策略
- wait--tt-darkmode-color: #FFFFFF;">实现思路其实整体的实现类似于 spring 的 @Retry 注解 。
(1)在锁同步方法上使用对应的注解 @Sync
(2)在异步回调方法上使用注解 @SyncCallback
(3)通过字节码增强调用方法 , 拥有上述注解的方法进行对应的加解锁实现
注解的定义同步加锁@Sync 同步注解可以放在希望同步等待的方法上 。
package com.github.houbb.sync.api.annotation;import com.github.houbb.sync.api.constant.LockType;import java.lang.annotation.*;import java.util.concurrent.TimeUnit;/** * 异步转同步注解 * * (1)根据标识匹配结果 * (2)直接简单的返回结果 * * @author binbin.hou * @since 0.0.1 */@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface Sync {/*** 超时时间** 单位 mills* @return 时间* @since 0.0.1*/long timeout() default 60 * 1000L;/*** 时间单位* @return 时间单位* @since 0.0.1*/TimeUnit timeUnit() default TimeUnit.MILLISECONDS;/*** 等待策略** (1)基于 countDownLatch 等待* (2)基于查询结果等等待** 不同等待策略 , 结果封装对用户不可见 。* @return 等待* @since 0.0.1*/LockType lock() default LockType.COUNT_DOWN_LATCH;}
所有的属性都有默认值 , 默认为 60s 超时 。
默认的加锁策略是 LockType.COUNT_DOWN_LATCH 。
异步解锁package com.github.houbb.sync.api.annotation;import java.lang.annotation.*;/** * 异步转同步注解 * * (1)根据标识匹配结果 * (2)直接简单的返回结果 * * @author binbin.hou * @since 0.0.1 */@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface SyncCallback {/*** 对应的方法名称** @return 方法名称* @since 0.0.1*/String value();}
这里异步回调解锁只有一个属性 , 那就是加锁对应的方法名称 。
这里我们不做过多的封装 , 保证 @Sync 注解的方法名称在当前类唯一即可 , 这个设计理念和 spring 的 @Retry 是一样的 。
@SyncCallback 可以根据方法名称 , 找到对应的 @Sync 注解信息 。
核心同步类接口定义package com.github.houbb.sync.api.api;/** * @author binbin.hou * @since 0.0.1 */public interface ISync {/*** 同步* @param context 上下文* @return 方法执行结果* @since 0.0.1* @throws Throwable 异常*/Object sync(final ISyncContext context) throws Throwable;}
接口定义非常简单 , 只有一个方法 , 通过上下文返回对应的值 。
上下文定义如下:
package com.github.houbb.sync.api.api;import com.github.houbb.sync.api.annotation.Sync;import com.github.houbb.sync.api.annotation.SyncCallback;import java.lang.reflect.Method;/** * sync 上下文 * * @author binbin.hou * @since 0.0.1 */public interface ISyncContext {/*** 同步注解信息* @return 同步注解* @since 0.0.1*/Sync sync();/*** 注解回调* @return 回调* @since 0.0.1*/SyncCallback callback();/*** 参数信息* @return 参数信息* @since 0.0.7*/Object[] params();/*** 方法信息* @return 方法信息* @since 0.0.7*/Method method();/*** 方法执行* @return 执行* @since 0.0.1* @throws Throwable 异常信息*/Object process() throws Throwable;}
- 图解|什么是高并发利器NoSQL
- 怎么理解分布式、高并发、多线程
- 写给大忙人看的,MyBatis日志如何做到兼容常用的日志框架
- 为什么 Django 框架持续统治着 Python 开发?
- 点云分类的自动放大框架 PointAugment
- 深入理解Logger日志——框架绑定原理
- 理解真实世界中 Go 的并发 BUG
- Go 中的 Goroutine 和其他并发处理方案的对比
- 迅易科技|| 拥抱“云”,更懂“云”,企业云采用框架落地实践
- 安卓|打破传统安卓系统框架!OriginOS的UI设计果然不俗