- 博客(9)
- 收藏
- 关注
原创 CompletableFuture 超时功能有大坑!使用不当直接生产事故!
中我们讨论了 CompletableFuture 超时功能的具体实现,从整体实现来说,JDK21前的版本有着内存泄露的bug,不过很少对实际生产有影响,因为任务的编排涉及的对象并不多,少量内存泄露最终会被回收掉。代码思路是这样的:有3个运行1秒的任务,在超时之后运行,不切线程池(都在 Delayer 线程运行),运行了3秒,不能在设置100ms的超时后运行,因为单线程排队了。示例代码中解决超时线程延迟执行的方法是使用CFFU提供的安全 timeout 方法,本文后面会分析相关源码。本文未经允许禁止转载!
2025-02-02 21:00:00
656
原创 如何安全发布 CompletableFuture ?Java9新增方法分析
我们知道CompletionStage接口定义了链式异步回调相关方法, CompletableFuture 相关读写操作(join, complete, obtrudeValue 等),不在CompletionStage的定义下,可以通过方法toCompletableFuture进行中转。子类可以指定默认执行器,不过需要注意调用不显式指定执行器的async相关方法时,其执行回调所在的线程有两种可能:当前调用线程或者子类指定的执行器线程。此方法返回只读的 CompletionStage,可以实现安全发布。
2025-01-30 10:49:29
613
原创 【异步编程实战】如何实现超时功能(以CompletableFuture为例)
对于CF的检查实际上不能保证原子性,因为这种检查-再计算的模式需要同步块的保护,而CF底层并没有这种实现。不过这种检查也有一定的好处,因为CF保证了结果写入后,isDone方法必然为true,从而避免执行不必要的代码。由于网络波动或者连接节点下线等种种问题,对于大多数网络异步任务的执行通常会进行超时限制,在异步编程中是一个常见的问题。,其是CF的增强类库,支持在JDK8环境中使用高版本的功能。当正常任务异常结束时,不会取消延迟队列中的任务,最终会导致内存泄露。,表示取消延迟任务时,任务从延迟队列删除。
2025-01-26 22:18:04
1680
原创 重试机制与 CompletableFuture 拓展
本文旨在讨论重试机制的特点和策略,分析常用重试类库的实现,讨论为 CompletableFuture 添加重试机制的方法。文章首发同名公众号,欢迎关注。
2025-01-23 20:23:51
658
原创 重试机制与 CompletableFuture 拓展
Spring Retry 实现了有状态的重试,很多方法需要显式传参数 RetryContext,有多种 RetryContext 支持,RetrySynchronizationManager 提供了全局 RetryContext 上下文支持,底层使用 ThreadLocal,提供获取上下文、注册上下文等方法。以下是一个常见的使用异步重试的例子,当我们需要重试功能时,只需调用 retry 方法,传入相应的重试策略即可。从结果可以看出,实现了延迟重试,重试等待时间为 500ms,三次尝试后获取到了正确结果。
2025-01-23 20:22:24
726
原创 深入理解 Future, CompletableFuture, ListenableFuture,回调机制
使用 ListenableFuture 还是 CompletableFuture?各有利弊,以下是我的个人看法:如果你使用的是 JDK8 的话,不推荐使用 CompletableFuture,因为有很多方法支持不足,比如设置超时时间,虽然可以使用一些工具类实现相关功能;不如直接使用 Guava,代码不易出错,文档齐全。JDK8 以上版本,首选 CompletableFuture,需要取消机制时,可以使用 ListenableFuture 搭配 ListeningExectuorService。潜龙勿用。
2025-01-23 00:07:43
1407
原创 API 设计之禅
根据笔者经历,很多大厂程序员所写的代码和大厂内部封装的各种中间件、类库,毫不客气地说,90%都是没有经过仔细考虑的,经常有各种各样的性能、拓展、可读性、一致性等问题。本文总结深刻,建议反复阅读学习。文章首发公众号,欢迎关注。通过这些设计原则,你将能够更好地理解和设计高质量、易用、可维护的 API,为长远的开发打下坚实的基础。本文由博客一文多发平台。
2025-01-22 23:02:31
461
原创 Java泛型涉及的概念总结
禁止转载,禁止套娃。向上转型:子类对象可以赋值给父类指针或接口指针。可以想象,父类(接口)派生出子类,画出来时,一般父类在上,子类在下,形象地表示为向上转型。举例:Object obj = new Car();不变:ArrayList<Integer> list = new ArrayList<Number>();以上赋值过程编译不通过,因为Java泛型不变形,对象的集合之间不保持继承关系。协变:Java提供协变声明,可以声明集合的子类,即集合对象的元
2022-02-23 20:30:00
224
原创 toArray方法总结
toArray方法涉及java的泛型,反射,数组的协变,jvm等知识。Java标准库中Collection接口定义了toArray方法,如果传入参数为空,则返回Object[]数组,如果传入参数为T[],则返回参数为传入参数的运行时类型。以下是ArrayList的实现:
2022-02-22 14:20:41
3057
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅