自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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关注的人

提示
确定要删除当前文章?
取消 删除