我花了两天时间没解决的问题,chatgpt用了5秒搞定
前言
一个说难不难,说简单竟看不出来是哪里问题的一个bug。是的可能自己能力和经验尚浅无法识别,下面你们能否用火眼金睛一眼让bug原形毕露
(这个问题是忽然暴露出来的,无任何征兆,没人改动过,生产上运行了很长时间,故很奇怪,所以这个间谍看来很会隐藏)隐藏的间谍
下面先来看代码(伪代码)code两个从数据库查询的耗时任务paramcountDownLatchparamallpublicstaticvoidtestCount(CountDownLatchcountDownLatch,ListStringall){for(inti0;i2;i){intfinalIi;ThreadPoolFactory。getGeneral()。execute((){try{ListStringcountListnewArrayList();这里之所以用for循环,是因为查询业务需要0和1两个状态去查询if(finalI0){这里其实是查询数据库的mapper操作,为了方便演示countList。add(1);countList。add(2);countList。add(3);}else{这里其实是查询数据库的mapper操作,为了方便演示countList。add(5);countList。add(6);countList。add(7);countList。add(8);}if(countList!null){all。addAll(countList);}}catch(Exceptionex){ex。printStackTrace();}finally{countDownLatch。countDown();}});}}线程池类publicclassThreadPoolFactory{privatestaticfinalLoggerloggerLoggerFactory。getLogger(ThreadPoolFactory。class);privatestaticfinalThreadFactoryGENERALTHREADFACTORYnewThreadFactoryBuilder()。setNameFormat(generalpoold)。build();corePoolSize:核心线程池大小maximumPoolSize:最大线程池大小keepAliveTime:线程最大空闲时间unit:时间单位workQueue:线程等待队列四种队列1。ArrayBlockingQueue:有界队列,2。SynchronousQueue:同步队列,3。LinkedBlockingQueue:无界队列,4。DelayQueue:延时阻塞队列threadFactory:线程创建工厂handler:拒绝策略四种策略1。ThreadPoolExecutor。AbortPolicy():2。ThreadPoolExecutor。CallerRunsPolicy():3。ThreadPoolExecutor。DiscardOldestPolicy():4。ThreadPoolExecutor。DiscardPolicy()privatestaticfinalExecutorServiceGENERALnewThreadPoolExecutor(5,10,30L,TimeUnit。MILLISECONDS,newLinkedBlockingQueue(4096),GENERALTHREADFACTORY,newThreadPoolExecutor。AbortPolicy());publicstaticExecutorServicegetGeneral(){returnGENERAL;}}main方法测试publicstaticvoidmain(String〔〕args)throwsException{ListStringallnewArrayList();CountDownLatchcountDownLatchnewCountDownLatch(2);testCount(countDownLatch,all);countDownLatch。await(10,TimeUnit。SECONDS);System。out。println(all);}复制代码
对于上面CountDownLatch不了解的的可以看下我历史的文章:干货!CountDownLatch的使用场景
看到这里不知道你们能否看出端倪,先说问题结果吧,最后的这个all集合为空,生产上的接口也是同样的问题,我上面的代码是和生产上的1:1复制的伪代码。
我先说下我的排查思路:1、线程池问题,我认为是线程没有被及时的回收,时间太长,并发数过高,导致线程不够用,第一想到的是便是线程数需要增加
2、数据库数据过多,导致查询比以前慢出一个量级,最后队列阻塞,拖垮线程(这个概率比较低,因为数据库查询很快返回,并没有需要优化的慢sql)
3、怀疑是这个循环造成的,比如某种机制少循环或者不循环,去掉for循环依然没解决问题验证第一位间谍
首先扩大核心线程数和最大线程数,将这俩参数扩大为10和20privatestaticfinalExecutorServiceGENERALnewThreadPoolExecutor(10,20,30L,TimeUnit。MILLISECONDS,newLinkedBlockingQueue(4096),GENERALTHREADFACTORY,newThreadPoolExecutor。AbortPolicy());复制代码
扩大之后,放上去能查出数据了,感觉解决了这个大问题
那句话怎么说来着,真相往往不是那么的容易发现,最先抓到的都是小鱼小虾,果不其然,运行了一周左右,同样的问题又出现了,感觉这就是一水缸,你把水缸变大,终有蓄满的一天。我们都知道,线程池可不是越大越好。
那么真相究竟是什呢,看到这里的小伙伴如果你已经有了答案,可以先去评论区评论,不要看下面的答案。借助GPT侦探柯南
chatgpt这里我就不多说了,这个东西如果现在还不了解的,那我就就只能求求你赶紧去了解下吧
我把生产上的代码完整的贴上去,他是这样回答的
不得不说,一语中的,仅5秒就把我们所能想到和不能想到的都回答出来了
很显然,第二点,第三点我们基本上验证通过了
那就是第一点了,其实我们早就应该想到这一点的,多线程环境下,线程安全问题是首位的!!!找出真凶
使用synchronized关键字解决线程安全
使用synchronized关键字来同步访问all列表,即在多个线程访问all列表时,使用同一个锁来保证线程安全,避免出现数据不一致的问题。这样就解决了多个线程可能会同时访问并修改数据,导致数据丢失或损坏的问题。
聪明的你有没有找出真凶呢???
还记得我们加大线程数来解决问题吗,我又问了一个问题
扩大线程池的参数可能会提高程序的并发处理能力,但并不能从根本上解决问题。如果是由于数据同步问题导致的线程池查不到数据,那么扩大线程池只是把问题暂时推迟了而已。此外,扩大线程池的核心线程池数量也会占用更多的系统资源AI已来,未来已来
再啰嗦一句,AI的强大这里就不再强调了,接下来我会持续利用GPT输出很多干货和其他AI生态的东西,都收在下方的AI专栏里,一起学习,一起成长,欢迎关注下方的AI专栏,点赞,谢谢各位看官
作者:苏世
链接:https:juejin。cnpost7219978250847928357
MIUI13新版本推送,底层升级安卓12,这两款小米手机可升小米MIUI系统是基于安卓系统底层开发,小米MIUI系统也被一些用户称为优化最好的安卓系统UI,小米MIUI系统在升级更新方面还是比较积极的。最近小米向小米11i和11i……
今日比赛前瞻中国vs日本,对话国足狭路相逢,此役当亮剑中国男足将于27日在日本东京进行的2022年卡塔尔世界杯亚洲区预选赛12强赛B组第七轮,中国男足将客场挑战日本队。在26日的赛前新闻发布会上,中国队主教练李霄鹏表示:客场……
穿越火线导火索剧情尚可一试的免费枪战体验我无法想象,在2021年的今天,穿越火线也能出个剧情模式。在小学的时候,穿越火线就是唯一的神,即使是我家那破烂电脑也能带得动。时隔多年,再次下载好穿越火线的高清大区,说实……
曼谷探店Papaya世界最大的古董商店Papaya世界最大的古董商店Papaya古董仓库是各个国家vintage爱好者来曼谷必来踩点的一处地方。整个仓库占地面积超过5000,一共有三层楼,现在仓库还在不……
天影沉默区区爆满还在在为找不着人气值爆棚的传奇烦恼?挖空心思时间精力各大网站找传奇,进N个手机游戏全是全屏幕看不到几人,连智能机器人的都没?我是真不知道说啥好图片,你是想玩单机手游嘛??……
令人惊叹的世界建筑(49张照片)令人惊叹的世界建筑(49张照片)匈牙利布达佩斯的渔夫堡垒1hr这座垂直花园位于西班牙马德里2hr俄罗斯圣彼得堡清真寺的大门。由建筑师尼古拉瓦西里耶夫设计……
周末赖床睡懒觉到底好不好?延年益寿周末(星期六、日)赖床睡懒觉到底好不好?对身体是好是坏?瑞典卡洛琳斯卡医学院最新研究表明,周末赖床,在某种程度上有延年益寿的功效。英国BBC中文网5月25日报道,周末赖个……
美媒列出了2022年最好的20名自由球员,哈登最大牌NBA的交易截止日期距离结束也不远了,自由市场有不少出色的自由球员,但并不是所有自由球员的去留都能影响联盟。因此,美媒《Fadeawayworld》的作者凯尔涂抹列出了2022……
热血传奇麻痹戒指虫子能爆?还有玩家真的信了,还是它爆率高传奇作为一款已经运营了二十年的游戏,游戏世界中的各种物品都已经是非常多了,而这其中能够直接体现玩家强大与否的装备种类更是非常的多。如果要问到具体有多少种武器我想可能也不会有几个……
春天如何养生春季的三个月,大地复苏,万物萌芽,是除旧迎新的季节,也是养生的好时机。气温变暖,人体的新陈代谢也开始变得旺盛,这时就需要养肝补脾。春季,地湿之气渐升,易困脾,春节养生要调……
结束了,所有归化球员都不能把中国当家,多人改回国籍或成真?北京时间3月31日,根据北青消息,4名巴西归化球员可能都在中国找不到工作了,也可能就此缘尽国足。如果成为现实,那么中国足球将以最糟糕的方式结束归化政策花了钱,没成绩,没未来。……
力压蚂蚁集团和马斯克的SpaceX,全球最大独角兽诞生,老板我国白手起家的富豪榜首,既不是香港首富李嘉诚,也不是台湾经商之王的王永庆,甚至都不是电商领导者马云,而是字节跳动的张一鸣!3月24日,胡润研究院发布了《2022胡润全球白手起家……