万万没想到在生产环境翻车了,之前以为很熟悉 CountDownLatch
前言
需求背景
具体实现
解决方案
总结
前言
之前我们分享了CountDownLatch的使用。这是一个用来控制并发流程的同步工具,主要作用是为了等待多个线程同时完成任务后,在进行主线程任务。然而,在生产环境中,我们万万没想到会出现问题。这是因为我们没有考虑到一些场景,导致了CountDownLatch出现了问题。
让我们来深入地了解一下由于CountDownLatch导致的问题。首先,我们需要明确的是,CountDownLatch是一个非常强大的工具。它可以帮助我们控制多个线程的执行过程,从而提高程序的并发性和效率。然而,如果我们没有正确地使用它,就可能会出现一些问题。
需求背景
先简单介绍下业务场景,针对用户批量下载的文件进行修改上传
为了提高执行的速度,我们採用了线程池来执行下载-修改-上传的操作。此外,我们还引入了CountDownLatch来控制线程之间的同步,以确保所有的操作都被正确执行。在所有线程完成之后,我们会将文件的地址保存到数据库中,以便之后的使用。这种方法不仅提高了程序的效率,而且减轻了线程的压力,从而使程序更加稳定可靠。
具体实现
根据服务本身情况,自定义一个线程池
模拟执行
一开始我个人感觉没有什么问题,反正finally都能够做减一的操作,到最后调用await方法,进行主线程任务
由于任务数量较多,阻塞队列中已经塞满了,所以线程池默认的拒绝策略会生效。当队列满时,处理策略会报错,并抛出异常。需要注意的是,这个异常是线程池自己抛出的,而非我们在循环中打印出来的。这种情况也会导致在线程池中断后,主线程会被打断,而await方法将无法执行。为了解决这个问题,我们可以利用jstack工具来查看线程池中的异常情况,并进行详细的分析和调试。此外,我们还可以进行一些优化措施,例如增加线程池的容量、调整任务队列的大小、优化任务处理策略等等,以提高线程池的性能和稳定性。
解决方案
为了解决阻塞队列过小导致的问题,我们可以考虑将其调大,但问题在于,应该调到多大才合适呢?如果调得太大,可能会带来内存溢出等其他问题。因此,我们需要在实际运行中不断测试和调整,找到一个适合当前情况的队列大小。
除了调整阻塞队列大小,我们还可以修改拒绝策略。在触发拒绝策略时,可以使用调用者所在的线程来执行任务。这种做法可以避免因线程池过载导致的任务执行失败。当然,这也可能会带来一些新的问题,例如如果调用者线程本身就很繁忙,可能会导致更多任务积压。因此,我们需要根据实际情况进行权衡和调整。
你可能会担心任务数量太多,导致调用者所在的线程执行不过来,从而导致任务提交的性能急剧下降。但是,不要担心,我们可以通过自定义拒绝策略来解决这个问题。我们可以将排队的消息记录下来,采用补偿机制的方式去执行,从而避免任务数量太多的问题。这样,您就可以放心地提交任务,无需担心性能问题。
同时,我们也需要注意线程池可能会抛出异常。因此,我们需要在代码中加入try catch语句,以记录问题数据。在finally中,我们还需要执行countDownLatch.countDown语句,以避免线程池的使用出现问题。这样,我们就可以更好地使用线程池,并且避免出现不必要的问题。
总结
根据业务部门的反馈,我们发现在实际业务中任务数量并不是很多。这可能是因为我们的系统中存在一些瓶颈,导致流程无法顺畅地进行。因此,我们决定先采用第二种方式来尝试解决这个线上问题。虽然这种方式可以解决目前的问题,但我们需要注意到,如果没有正确地关闭countDownLatch,就会导致一直等待。为了避免这个问题,我们需要对代码进行一些修改,以确保其正常运行。
另外,我们需要意识到,工具虽然是好的,但其使用也可能带来一些问题。如果我们没有正确地处理,就会引发一系列连锁反应。因此,我们需要仔细地评估工具的使用,以确保我们能够使其发挥最大的效益,同时避免潜在的问题。我们可以考虑对新工具进行一些测试,以确保其稳定性和可靠性。此外,我们还可以开发一些新的功能,以提高我们的工作效率。这些功能可以包括自动化流程、数据分析和报告生成等。
相关文章:
万万没想到在生产环境翻车了,之前以为很熟悉 CountDownLatch
前言 需求背景 具体实现 解决方案 总结 前言 之前我们分享了CountDownLatch的使用。这是一个用来控制并发流程的同步工具,主要作用是为了等待多个线程同时完成任务后,在进行主线程任务。然而,在生产环境中,我们万万没想到会…...
Springboot整合Jasypt实战
Springboot整合Jasypt实战 引入依赖 <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version> </dependency>配置jasypt # 配置jasypt相关信息…...
计算机网络笔记:DNS域名解析过程
基本概念 DNS是域名系统(Domain Name System)的缩写,也是TCP/IP网络中的一个协议。在Internet上域名与IP地址之间是一一对应的,域名虽然便于人们记忆,但计算机之间只能互相认识IP地址,域名和IP地址之间的转…...
C语言函数大全-- s 开头的函数(4)
C语言函数大全 本篇介绍C语言函数大全-- s 开头的函数(4) 1. strdup 1.1 函数说明 函数声明函数功能char * strdup(const char *s);用于将一个以 NULL 结尾的字符串复制到新分配的内存空间中 注意: strdup() 函数返回指向新分配的内存空间…...
Linux常见指令 (2)
Linux常见指令 ⑵ 补充man描述:用法:例子 echo描述:用法:例子 echo 字符串例子 echo 字符串 > 文件例子 追加重定向(>>)例子 输出重定向(>)来创建文件 && (>)来清空文件 cat描述:用法:例子 cat && cat 文件补充:例子 cat 文件 && cat &…...
shell脚本4
字符串变量 格式介绍:单引号 varabc 双引号 var"abc" 不使用引号 varabc 区别:单引号,原样输出,不会解析里面的变量 双引号,会解析变量,并且可以使用子双引号,需要转…...
递归思路讲解
最近刷到了树这一模块的算法题,树相关的算法题几乎都是用递归来实现的,但递归的思路却有点抽象,每次遇到递归,都是通过递归来深度或广度地遍历树,但对于递归遍历树的遍历路线,却有点抽象难懂,不…...
基于R语言APSIM模型高级应用及批量模拟
目录 专题一 APSIM模型应用与R语言数据清洗 专题二 APSIM气象文件准备与R语言融合应用 专题三 APSIM模型的物候发育和光合生产模块 专题四 APSIM物质分配与产量模拟 专题五 APSIM土壤水平衡模块 专题六 APSIM土壤碳、氮平衡模块 专题七 APSIM农田管理模块与情景模拟 专…...
Hyperf中的其它事项
Hyperf中的其它事项 关于 Hyperf 其它的内容我们就不多说了,毕竟框架这东西用得多了自然也就熟悉了。最重要的是——我的水平还不足以去深入地分析这个框架! 好吧,其它的功能大家可以去官方文档详细了解,毕竟国人自己做的框架&a…...
【技术选型】Elasticsearch 和Solr那个香?
我们为什么在这里?我存在的目的是什么?我应该运动还是休息并节省能量?早起上班或晚起并整夜工作?我应该将炸薯条和番茄酱或蛋黄酱一起吃吗? 这些都是古老的问题,可能有也可能没有答案。其中一些是非常困难或…...
4面美团测试工程师,因为这个小细节,直接让我前功尽弃.....
说一下我面试别人时候的思路 反过来理解,就是面试时候应该注意哪些东西;用加粗部分标注了 一般面试分为这么几个部分: 一、自我介绍 这部分一般人喜欢讲很多,其实没必要。大约5分钟内说清楚自己的职业经历,自己的核…...
数据恢复软件EasyRecovery16下载安装步骤教程
EasyRecovery16是一款专业好用的数据恢复软件,软件提供了向导式的操作向导,可以有效地恢复电脑或者移动存储设备中丢失的各种文件,包括删除的文件、格式化丢失的文件和清空回收站的数据!千呼万唤始出来,大家期盼许久的EasyRecover…...
Springboot 自定义缓存配置 CacheManager 及redis集成
目录 前言 集成 maven依赖 CacheManagerConfig配置 redis配置 使用 Springboot 集成使用缓存 Cacheable CacheEvict 前言 现有项目中经常遇到的缓存集成问题,Springboot提供了统一的接口抽象与缓存管理器,可集成多种缓存类型,如 Co…...
JS 中七个改变原数组的方法
目录 一、push 二、pop 三、unshift 四、shift 五、splice 六、sort 七、reverse 一、push 在数组的尾部添加元素,并返回新的长度。 let arr [1] arr.push(2) console.log(arr) // [1, 2] 二、pop 删除数组最后面一个元素、并返回删除的元素。 let arr [1, …...
【笔试强训选择题】Day7.习题(错题)解析
作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 文章目录…...
Vue电商项目--axios二次封装
postman测试接口 刚刚经过postman工具测试,发现接口果然发生了改变。 新的接口为http://gmall-h5-api.atguigu.cn 如果服务器返回的数据code字段200,代表服务器返回数据成功 整个项目,接口前缀都有/api字样 axios二次封装 XmlHttpRequ…...
人生四维度
人生四维度 不是有钱了就成功,你知道;人生的成功不止一种,你也知道。但成功还有哪种?你知道吗? 如果把人生的体验展开,我们可以得到四个维度,高度、深度、宽度和温度。 财富、权力、影响力 构…...
Python 调用 MessageBeep 播放系统音效
Python 调用 MessageBeep 播放 Windows 系统提示声音 Windows API 函数 "MessageBeep" 介绍 "Windows API MessageBeep"是一个用于发出系统提示音效的函数。它可以向用户发出一种预定义的声音,以指示事件的发生或某个条件的满足。例如…...
废物,我TMD一个985却斗不过专科生(大厂自动化测试2年被裁)
前言 看到标题,可能很多读者朋友恐怕又要骂我了,985这个特殊的字眼也确实异常晃眼,实际上现在985,211也越来越多,它能代表你能够进入到更高的平台,拿到“高级工厂”的入场券,但并不意味着你会成…...
p70 内网安全-域横向内网漫游 Socks 代理隧道技术(NPS、FRP、CFS 三层内网漫游)
数据来源 本文仅用于信息安全学习,请遵守相关法律法规,严禁用于非法途径。若观众因此作出任何危害网络安全的行为,后果自负,与本人无关。 必要基础知识点: 内外网简单知识内网 1 和内网 2 通信问题正向反向协议通…...
第三十二章 Unity Mecanim动画系统(上)
在上一章节中,我们介绍了Unity的旧版动画系统,本章节来介绍新版的Mecanim动画系统。新版的Mecanim动画系统实际是对旧版动画系统的升级。新版的Mecanim动画系统仍然是建立在动画片段的基础上的,只不过它给我们提供了一个可视化的窗口来编辑动…...
第二章 集合
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…...
这一篇Databinding应该可以帮助迅速上手吧
Databinding使用篇(迅速上手) 使用前需要在模块级别的build.gradle里面的android闭包里添加: dataBinding{enabled true}接着在layout文件中按下Alt 回车, 将布局转换成data binding layout即可,此时编译就会生成对…...
【PHP在线定制商城网站源码V3.0】开源的DIY在线定制商城系统+在线礼品定制
源码下载:https://download.csdn.net/download/m0_66047725/87637177 PHP在线定制商城网站源码,免费开源、免费下载。本商城基于mycncart开发。安装成功后即可浏览,你可以在后台->安装扩展功能上传安装插件,在代码调整中点击刷…...
cout源码浅析
目录 cout源码浅析 那么对于没有定义在这之中的要怎么办呢? 实际使用 结语 首先来看我从cplusplus中截取的这张图: 注意最下面这一行字。cout其实是ostream的一个标准对象object。而上面则演示了一些继承关系。 好的,理解了之后…...
发送Ajax get请求详解
发送AJAX get请求,前端代码: <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>ajax get请求</title> </head> <body> <script type"text/java…...
SQL语句
创建及删除数据库和表 CREATE DATABASE 数据库名; CREATE DATABASE school; 创建新的表 CREATE TABLE 表名(字段1 数据类型,字段2 数据类型[,...] [,PRIMARY KEY (主键名)]); #主键一般选择能代表唯一性的字段,不允许取空值(NULL),值也不允许重复&…...
Mysql 学习(八)单表查询方法二
复杂查询 上一节说了5种访问类型的查询,这一节就来说说关于这些比较复杂的查询 情况一:多个二级索引查询 sql:SELECT * FROM index_value_table WHERE value1 abc AND value2 > 1000;搜索条件: value1 等于 abcvalue2 大于…...
安卓系统下的截屏和录屏
可以抓取手机屏幕画面(屏幕截图),也可以录制屏幕画面视频。拍摄屏幕后,可以查看、编辑和分享所拍的图片或视频。 抓取屏幕截图 打开要抓取的屏幕。视手机情况执行下列一个操作,3种方法看你手机有效的: 同…...
行为型模式-中介者模式
中介者模式 概述 一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定。例如在下左图中…...
合作做网站的总结和心得/手机百度高级搜索入口
.第一,友好界面。高速公路收费管理系统开发设计,界面的友好性比较重要,满足这一要求才能体现出人性化设计特征,和用户应用系统便捷性相适应,动态的人机交互设计,用户应用系统的时候能感受到操作的便利&…...
直播app开发需求/西安百度推广优化公司
平时真不怎么关注printf的返回值,一般是直接调用printf格式化输出,今天做腾讯的笔试题发现了一个知识漏洞,特此记录。 首先,题目是这样的:int f(int a, int b, int c){ return 0;}int main(){ return f(printf("a…...
网站建设与维护的软件/长沙网站托管优化
首先有一个登录界面: 这个登录界面还有一个效果就是关闭的时候缓慢消失,视觉上更好看一点: QPropertyAnimation *animation new QPropertyAnimation(this,"windowOpacity");animation->setDuration(1000);animation->setSt…...
资讯网站模板带会员投稿功能/168推广网
新闻 《Android Studio 2.0发布稳定版》:Android Studio 2.0稳定版终于发布了,还在使用1.5版本或beta版的同学可以放心升级了。作为Google的官方IDE,Android Studio包括你构建应用时需要的所有东西,包括代码编辑器、代码分析工具、…...
响应式mvc企业网站源码/上海网站营销seo电话
计算机的本质就是计算,在其内部是0和1的比特位的变化,对外表现就是数据的变化。那么,计算机都能处理什么数据呢?本质上,数据都是以字节(Byte)存储的,表现上看,它们就是整数、浮点数和字符串等。…...
网站建设 石景山/大数据分析培训机构
nginx的location配置 使用的版本是nginx1.18.0。 nginx各个版本差别不大,可以通用。 简介 nginx的location配置是为了让不同的url访问指向不同的资源文件位置,例如下面的配置: server {listen 8080;server_name localhost;#chars…...