万万没想到在生产环境翻车了,之前以为很熟悉 CountDownLatch

news2024/12/24 9:54:50
  • 前言

  • 需求背景

  • 具体实现

  • 解决方案

  • 总结


前言 

之前我们分享了CountDownLatch的使用。这是一个用来控制并发流程的同步工具,主要作用是为了等待多个线程同时完成任务后,在进行主线程任务。然而,在生产环境中,我们万万没想到会出现问题。这是因为我们没有考虑到一些场景,导致了CountDownLatch出现了问题。

让我们来深入地了解一下由于CountDownLatch导致的问题。首先,我们需要明确的是,CountDownLatch是一个非常强大的工具。它可以帮助我们控制多个线程的执行过程,从而提高程序的并发性和效率。然而,如果我们没有正确地使用它,就可能会出现一些问题。

 

需求背景

先简单介绍下业务场景,针对用户批量下载的文件进行修改上传

为了提高执行的速度,我们採用了线程池来执行下载-修改-上传的操作。此外,我们还引入了CountDownLatch来控制线程之间的同步,以确保所有的操作都被正确执行。在所有线程完成之后,我们会将文件的地址保存到数据库中,以便之后的使用。这种方法不仅提高了程序的效率,而且减轻了线程的压力,从而使程序更加稳定可靠。

 

具体实现

根据服务本身情况,自定义一个线程池

 

模拟执行 

一开始我个人感觉没有什么问题,反正finally都能够做减一的操作,到最后调用await方法,进行主线程任务 

由于任务数量较多,阻塞队列中已经塞满了,所以线程池默认的拒绝策略会生效。当队列满时,处理策略会报错,并抛出异常。需要注意的是,这个异常是线程池自己抛出的,而非我们在循环中打印出来的。这种情况也会导致在线程池中断后,主线程会被打断,而await方法将无法执行。为了解决这个问题,我们可以利用jstack工具来查看线程池中的异常情况,并进行详细的分析和调试。此外,我们还可以进行一些优化措施,例如增加线程池的容量、调整任务队列的大小、优化任务处理策略等等,以提高线程池的性能和稳定性。 


解决方案 

为了解决阻塞队列过小导致的问题,我们可以考虑将其调大,但问题在于,应该调到多大才合适呢?如果调得太大,可能会带来内存溢出等其他问题。因此,我们需要在实际运行中不断测试和调整,找到一个适合当前情况的队列大小。

除了调整阻塞队列大小,我们还可以修改拒绝策略。在触发拒绝策略时,可以使用调用者所在的线程来执行任务。这种做法可以避免因线程池过载导致的任务执行失败。当然,这也可能会带来一些新的问题,例如如果调用者线程本身就很繁忙,可能会导致更多任务积压。因此,我们需要根据实际情况进行权衡和调整。

你可能会担心任务数量太多,导致调用者所在的线程执行不过来,从而导致任务提交的性能急剧下降。但是,不要担心,我们可以通过自定义拒绝策略来解决这个问题。我们可以将排队的消息记录下来,采用补偿机制的方式去执行,从而避免任务数量太多的问题。这样,您就可以放心地提交任务,无需担心性能问题。

同时,我们也需要注意线程池可能会抛出异常。因此,我们需要在代码中加入try catch语句,以记录问题数据。在finally中,我们还需要执行countDownLatch.countDown语句,以避免线程池的使用出现问题。这样,我们就可以更好地使用线程池,并且避免出现不必要的问题。


总结 

根据业务部门的反馈,我们发现在实际业务中任务数量并不是很多。这可能是因为我们的系统中存在一些瓶颈,导致流程无法顺畅地进行。因此,我们决定先采用第二种方式来尝试解决这个线上问题。虽然这种方式可以解决目前的问题,但我们需要注意到,如果没有正确地关闭countDownLatch,就会导致一直等待。为了避免这个问题,我们需要对代码进行一些修改,以确保其正常运行。

另外,我们需要意识到,工具虽然是好的,但其使用也可能带来一些问题。如果我们没有正确地处理,就会引发一系列连锁反应。因此,我们需要仔细地评估工具的使用,以确保我们能够使其发挥最大的效益,同时避免潜在的问题。我们可以考虑对新工具进行一些测试,以确保其稳定性和可靠性。此外,我们还可以开发一些新的功能,以提高我们的工作效率。这些功能可以包括自动化流程、数据分析和报告生成等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/479516.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode】583. 两个字符串的删除操作

583. 两个字符串的删除操作(中等) 思路 这道题的状态定义和 1143. 最长公共子序列 相同,「定义一个 dp 数组,其中 dp[i]表示到位置 i 为止的子序列性质,并不是必须以 i 结尾」,此时 dp 数组的最后一位即为…

富士康终于醒悟了,重新加码中国制造,印度制造信不过

4月25日富士康在郑州揭牌新事业总部,显示出在扰攘了数年之后,富士康再度加强郑州富士康的发展力度,这应该是富士康在印度努力数年之后终于清醒了,印度制造终究不如中国制造可靠。 一、苹果和富士康在印度发展的教训 这两年苹果和富…

智能算法系列之基于粒子群优化的模拟退火算法

文章目录 前言1. 算法结合思路2. 问题场景2.1 Sphere2.2 Himmelblau2.3 Ackley2.4 函数可视化 3. 算法实现代码仓库:IALib[GitHub] 前言 本篇是智能算法(Python复现)专栏的第四篇文章,主要介绍粒子群优化算法与模拟退火算法的结合,以弥补各自…

【unity项目实战】3DRPG游戏开发07——其他详细的设计

敌人动画设计 新增图层动画,把权重设为1 在新图层默认新建一个空状态Base State,实现怪物默认动画播放Base State,因为Base State是空动画,所以默认会找上一个层的动画,这样就实现了两个图层动画的切换,也可以选择修改权重的方式实现 敌人随机巡逻 显示敌人巡逻的范…

网络字节序和主机字节序详解(附代码)

一、网络字节序和主机字节序 网络字节序和主机字节序是计算机网络中常用的两种数据存储格式。 主机字节序: 指的是在计算机内部存储数据时采用的字节排序方式。对于一个长为4个字节的整数,若采用大端字节序,则该整数在内存中的存储顺序是&a…

AppScan-被动手动扫描

被动扫描是针对性的扫描,浏览器代理到AppScan,然后进行手工操作,探索产生出的流量给AppScan进行扫描。这样可以使得扫描足够精准,覆盖率更加高,还能减少不必要的干扰 (一)环境准备 1、火狐安装…

SAP UI5 之Controls (控件) 笔记三

文章目录 官网 Walkthrough学习-Controls控件1.0.1 在index.html中使用class id 属性控制页面展示的属性1.0.2 我们在index.js文件中引入 text文本控制1.0.3打开浏览器查看结果 官网 Walkthrough学习-Controls控件 Controls控件 在前面展示在浏览器中的Hello World 是在Html …

Presto 之Hash Join的Partition

一. 前言 在Presto中,当两表Join为Hash Join并且join_distribution_type为PARTITIONED的时候,Presto会将Build表分区(Partition)后再进行Join操作。在Presto中的Join操作中,对表的分区有两级,第一级是将Has…

超简单搭建一个自用的ChatGPT网站(支持给网站添加访问密码)

前言: 有小伙伴留言想在自己的服务器搭建上图所示的ChatGPT网站,那么今天就是教大家如何在自己的服务器搭建像上图所示的ChatGPT网站 准备条件: 1)一台服务器(这里用centos7) 2)ChatGPT的API-KEY 一、Docker环境部署…

存储资源调优技术——SmartThin智能精简配置技术

目录 基本概念 工作原理 SmartThin关键技术 SmartThin主要功能 应用场景 精简LUN,存储空间超分配 按需动态分配存储资源,提高存储资源利用率 Thick和Thin LUN的区别如下 基本概念 Thin Lun属于存储资源的虚拟化,因此需要基于RAID 2.0存…

当影像遇上Python:用MoviePy库轻松搞定视频编辑

I. 简介 当影像遇上Python:用MoviePy库轻松搞定视频编辑 I. 简介II. 安装III. 使用 🚀🎬1. 创建一个视频剪辑对象2. 剪辑视频3. 剪切视频片段4. 改变视频尺寸和速度5. 合并视频6. 合并多个视频7. 用混合模式合并视频8. 添加音频9. 添加背景音…

台北房价预测

目录 1.数据理解1.1分析数据集的基本结构,查询并输出数据的前 10 行和 后 10 行1.2识别并输出所有变量 2.数据清洗2.1输出所有变量折线图2.2缺失值处理2.3异常值处理 3.数据分析3.1寻找相关性3.2划分数据集 4.数据整理4.1数据标准化 5.回归预测分析5.1线性回归&…

C++之深入解析如何实现一个线程池

一、基础概念 当进行并行的任务作业操作时,线程的建立与销毁的开销是,阻碍性能进步的关键,因此线程池,由此产生。使用多个线程,无限制循环等待队列,进行计算和操作,帮助快速降低和减少性能损耗…

Linux-初学者系列4_rpm-yum软件包管理

Linux-初学者系列4_rpm-yum软件包管理 一、软件包管理 系统软件安装后默认目录路径: /user/local /opt这两个目录用来存放用户自编译安装软件的目录,对于通过源码包安装的软件,如果没有指定安装目录,一般会装在以上目录中。 使…

利用Python轻松实现视频合成!

🎥 利用Python轻松实现视频合成!💻 你是否曾经尝试过在一个视频中添加另一个小视频的场景呢?如果是,你一定会知道这是一项令人头疼的任务。但是,有了Python的 moviepy 库,这个任务将变得非常简单…

Java AIO(Java Asynchronous I/O:异步非阻塞IO)

1.基本介绍 1>.JDK7引入了Asynchronous I/O,即AIO.在进行I/O编程中,常用到两种模式:Reactor和Proactor; 2>.Java的NIO就是Reactor,当有事件触发时,服务器端得到通知,进行相应的处理; 3>.AIO即NIO2.0,叫做异步不阻塞的IO.AIO引入了异步通道的概念,采用了Proactor模式…

Java之类和对象

一、类和对象 C和Java都是面向对象编程的语言,而C和Go是面向过程编程的语言. 主要概述一下面向对象编程,也就是op.在面向对象的世界中,一切皆对象.解决问题的途径主要是靠对象之间的交互去完成. 类的模板 类就是对一种事物的概述,比如说猫类,狗类,人类等等,在这些类中,有成…

为什么WEB端通常采用3DTILES 格式进行发布?

为什么WEB端通常采用3DTILES 格式进行发布? 随着互联网技术的发展和普及,Web端三维数据可视化和呈现越来越受到关注和重视。在这个背景下,采用合适的标准格式进行数据发布和交换变得尤为重要。3DTILES是一种新型的三维数据标准格式,具有多种…

数据降维 | MATLAB实现基于LFDA基于局部费歇尔判别的分类数据降维可视化

数据降维 | MATLAB实现基于LFDA基于局部费歇尔判别的分类数据降维可视化 目录 数据降维 | MATLAB实现基于LFDA基于局部费歇尔判别的分类数据降维可视化基本介绍模型描述程序设计学习小结基本介绍 MATLAB实现基于LFDA基于局部费歇尔判别的分类数据降维可视化 模型描述 局部费歇尔…

Linux之【多线程】线程互斥(锁)线程同步(条件变量)

Linux之【多线程】线程互斥(锁)&线程同步(条件变量) 一、引入:线程安全问题二、浅谈""和"- -"非原子性操作三、Linux线程互斥3.1 互斥量-->mutex⚠️3.1.1 互斥锁的理解3.1.2 深入了解锁的…