Category: 实践
-
CompletableFuture的使用不当
对Completablefuture的使用不当,在异步请求中又嵌入了异步调用,当依赖服务变慢或请求量变大时,future会相互等待产生死锁。 在Java中,使用CompletableFuture时出现死锁的情况可能与不当的线程同步和锁定有关。下面是一个示例程序,演示了如何使用CompletableFuture造成死锁,并输出类似于您提供的死锁日志。 解释 解决方法 要避免死锁,可以重新设计代码,确保锁的获取顺序一致,或者尽量减少对共享资源的锁定。 要还原一个使用CompletableFuture的不当用法,在异步请求中又嵌入异步调用,导致在依赖服务变慢或请求量变大时产生死锁的场景,可以通过创建两个相互依赖的CompletableFuture任务来实现。下面是一个示例代码: 解释 运行结果 当您运行此程序时,您会发现程序被永久卡住,因为两个CompletableFuture互相等待,导致死锁。 解决方案 避免这种情况的方法是重新设计异步任务的依赖关系,确保不会出现互相等待的情况。可以通过以下方式解决: 例如,使用thenCompose来避免死锁: 在这个解决方案中,future2依赖于future1,并且使用thenRunAsync来避免直接等待,从而避免了死锁。 如何发现这一问题: JStack 是一个分析 Java 应用程序线程状态的有用工具,特别是在诊断死锁问题时非常有用。以下是如何使用 JStack 分析死锁问题的步骤: 步骤 1:获取 Java 进程 ID 首先,需要获取正在运行的 Java 应用程序的进程 ID(PID)。可以使用以下命令找到 PID: 这个命令将列出所有运行的 Java 进程及其 PID。例如: 这里 12345 是 Java 应用程序的 PID。 步骤 2:生成线程转储 使用 jstack 命令生成指定 Java 进程的线程转储: 这将生成一个包含所有线程状态的文件 thread_dump.txt。 步骤 3:分析线程转储 打开生成的 thread_dump.txt 文件,查找死锁信息。通常,如果存在死锁,jstack 输出中会有类似以下的信息:
-
业务开发处理流程:注意和考虑LIST
序号 分类 内容 备注 1 业务评审 需求背景,期望目标 业务是否合理 2 业务流程、交互方式 3 技术评审 整体架构设计(架构图) 技术是否合理 4 数据模型设计 5 关键技术、核心算法 6 数据交互方式 7 核心接口设计 8 中间件 消息中间件 配置是否申请 9 任务调度 10 搜索引擎 11 文件存储 12 数据安全 历史数据处理 13 数据补偿方案 14 灰度方案 客户端灰度 15 接口灰度 16 回滚策略 17 系统性能 需求系统性能 TPS、RT、VU(并发用户数)各是多少? 18 随着数据量的增大系统性能会不会出现明显问题 19 系统哪个环节会是最大的瓶颈?系统性能拐点是那里? 20 是否打算做压力测试?做哪些类型的压力测试,为何?压力测试方案是怎么样的? 21…
-
MybatisPlus中like查询匹配多个字段用法
写法如下: 控制台打印sql语句如下:
-
Hexo一个快速、简洁且高效的博客框架
Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他标记语言)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。 参考: https://github.com/fluid-dev/hexo-theme-fluid https://hexo.io/zh-cn/docs/ https://www.zhangkunzhi.com/ https://github.com/ycltpe/blogHexo
-
SpringBoot Admin
Spring Boot Admin是一个开源的监控和管理Spring Boot应用程序的工具。它提供了一个直观的用户界面,用于监控和管理多个Spring Boot应用程序的运行状态、健康状况和配置信息。