最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

兩天沒(méi)解決的問(wèn)題chatgpt用了5秒搞定隱藏bug

 更新時(shí)間:2023年04月10日 17:29:52   作者:蘇世_  
這篇文章主要為大家描述了我用了兩天沒(méi)解決的問(wèn)題chatgpt用了5秒搞定的全程介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

一個(gè)說(shuō)難不難,說(shuō)簡(jiǎn)單竟看不出來(lái)是哪里問(wèn)題的一個(gè)bug。是的 可能自己能力和經(jīng)驗(yàn)尚淺無(wú)法識(shí)別,下面你們能否用火眼金睛一眼讓bug原形畢露

(這個(gè)問(wèn)題是忽然暴露出來(lái)的,無(wú)任何征兆,沒(méi)人改動(dòng)過(guò),生產(chǎn)上運(yùn)行了很長(zhǎng)時(shí)間,故很奇怪,所以這個(gè)間諜看來(lái)很會(huì)隱藏)

隱藏的“間諜”

下面先來(lái)看代碼(偽代碼)

code

/**
 * 兩個(gè)從數(shù)據(jù)庫(kù)查詢的耗時(shí)任務(wù)
 * @param countDownLatch
 * @param all
 */
public static void testCount(CountDownLatch countDownLatch, List<String> all) {
    for (int i = 0; i < 2; i++) {
        int finalI = i;
        ThreadPoolFactory.getGeneral().execute(() -> {
            try {
                List<String> countList = new ArrayList<>();
                //這里之所以用for循環(huán),是因?yàn)椴樵儤I(yè)務(wù)需要0和1兩個(gè)狀態(tài)去查詢
                if (finalI == 0) {
                //這里其實(shí)是查詢數(shù)據(jù)庫(kù)的mapper操作,為了方便演示
                    countList.add("1");
                    countList.add("2");
                    countList.add("3");
                } else {
                //這里其實(shí)是查詢數(shù)據(jù)庫(kù)的mapper操作,為了方便演示
                    countList.add("5");
                    countList.add("6");
                    countList.add("7");
                    countList.add("8");
                }
                if (countList != null) {
                    all.addAll(countList);
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            } finally {
                countDownLatch.countDown();
            }
        });
    }
}
//線程池類(lèi)
public class ThreadPoolFactory {
    private static final Logger logger = LoggerFactory.getLogger(ThreadPoolFactory.class);
    private static final ThreadFactory GENERAL_THREAD_FACTORY = new ThreadFactoryBuilder().setNameFormat("general-pool-%d").build();
    /**
     * corePoolSize:核心線程池大小
     * maximumPoolSize:最大線程池大小
     * keepAliveTime:線程最大空閑時(shí)間
     * unit:時(shí)間單位
     * workQueue:線程等待隊(duì)列  四種隊(duì)列 1.ArrayBlockingQueue:有界隊(duì)列,2.SynchronousQueue:同步隊(duì)列,3.LinkedBlockingQueue:無(wú)界隊(duì)列,4.DelayQueue:延時(shí)阻塞隊(duì)列
     * threadFactory:線程創(chuàng)建工廠
     * handler:拒絕策略 四種策略 1.ThreadPoolExecutor.AbortPolicy():2.ThreadPoolExecutor.CallerRunsPolicy():3.ThreadPoolExecutor.DiscardOldestPolicy():4.ThreadPoolExecutor.DiscardPolicy()
     */
    private static final ExecutorService GENERAL = new ThreadPoolExecutor(5, 10,
            30L, TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<>(4096), GENERAL_THREAD_FACTORY, new ThreadPoolExecutor.AbortPolicy());
    public static ExecutorService getGeneral() {
        return GENERAL;
    }
}
//main方法測(cè)試
public static void main(String[] args) throws Exception {
    List<String> all = new ArrayList<>();
    CountDownLatch countDownLatch = new CountDownLatch(2);
    testCount(countDownLatch,all);
    countDownLatch.await(10, TimeUnit.SECONDS);
    System.out.println(all);
}

對(duì)于上面CountDownLatch不了解的的可以看下我歷史的文章: 干貨!CountDownLatch的使用場(chǎng)景

看到這里不知道你們能否看出端倪,先說(shuō)問(wèn)題結(jié)果吧,最后的這個(gè)all集合為空,生產(chǎn)上的接口也是同樣的問(wèn)題,我上面的代碼是和生產(chǎn)上的1:1復(fù)制的偽代碼。

我先說(shuō)下我的排查思路:

1、線程池問(wèn)題,我認(rèn)為是線程沒(méi)有被及時(shí)的回收,時(shí)間太長(zhǎng),并發(fā)數(shù)過(guò)高,導(dǎo)致線程不夠用,第一想到的是便是線程數(shù)需要增加

2、數(shù)據(jù)庫(kù)數(shù)據(jù)過(guò)多,導(dǎo)致查詢比以前慢出一個(gè)量級(jí),最后隊(duì)列阻塞,拖垮線程(這個(gè)概率比較低,因?yàn)閿?shù)據(jù)庫(kù)查詢很快返回,并沒(méi)有需要優(yōu)化的慢sql)

3、懷疑是這個(gè)循環(huán)造成的,比如某種機(jī)制少循環(huán)或者不循環(huán),去掉for循環(huán)依然沒(méi)解決問(wèn)題

驗(yàn)證第一位”間諜“

首先擴(kuò)大核心線程數(shù)和最大線程數(shù),將這倆參數(shù)擴(kuò)大為10和20

private static final ExecutorService GENERAL = new ThreadPoolExecutor(10, 20,
            30L, TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<>(4096), GENERAL_THREAD_FACTORY, new ThreadPoolExecutor.AbortPolicy());

擴(kuò)大之后,放上去能查出數(shù)據(jù)了,感覺(jué)解決了這個(gè)大問(wèn)題

那句話怎么說(shuō)來(lái)著,真相往往不是那么的容易發(fā)現(xiàn),最先抓到的都是小魚(yú)小蝦,果不其然,運(yùn)行了一周左右,同樣的問(wèn)題又出現(xiàn)了,感覺(jué)這就是一水缸,你把水缸變大,終有蓄滿的一天。我們都知道,線程池可不是越大越好。

那么真相究竟是什呢,看到這里的小伙伴如果你已經(jīng)有了答案,可以先去評(píng)論區(qū)評(píng)論,不要看下面的答案。

借助GPT“偵探柯南”

chatgpt這里我就不多說(shuō)了,這個(gè)東西如果現(xiàn)在還不了解的,那我就。。。就只能求求你趕緊去了解下吧

我把生產(chǎn)上的代碼完整的貼上去,他是這樣回答的

不得不說(shuō),一語(yǔ)中的,僅5秒就把我們所能想到和不能想到的都回答出來(lái)了

  • 很顯然,第二點(diǎn),第三點(diǎn)我們基本上驗(yàn)證通過(guò)了
  • 那就是第一點(diǎn)了,其實(shí)我們?cè)缇蛻?yīng)該想到這一點(diǎn)的,多線程環(huán)境下,線程安全問(wèn)題是首位的!??!

找出"真兇"

使用synchronized關(guān)鍵字解決線程安全

使用synchronized關(guān)鍵字來(lái)同步訪問(wèn)all列表,即在多個(gè)線程訪問(wèn)all列表時(shí),使用同一個(gè)鎖來(lái)保證線程安全,避免出現(xiàn)數(shù)據(jù)不一致的問(wèn)題。這樣就解決了多個(gè)線程可能會(huì)同時(shí)訪問(wèn)并修改數(shù)據(jù),導(dǎo)致數(shù)據(jù)丟失或損壞的問(wèn)題。

聰明的你有沒(méi)有找出“真兇”呢???

還記得我們加大線程數(shù)來(lái)解決問(wèn)題嗎,我又問(wèn)了一個(gè)問(wèn)題

擴(kuò)大線程池的參數(shù)可能會(huì)提高程序的并發(fā)處理能力,但并不能從根本上解決問(wèn)題。如果是由于數(shù)據(jù)同步問(wèn)題導(dǎo)致的線程池查不到數(shù)據(jù),那么擴(kuò)大線程池只是把問(wèn)題暫時(shí)推遲了而已。此外,擴(kuò)大線程池的核心線程池?cái)?shù)量也會(huì)占用更多的系統(tǒng)資源

AI已來(lái),未來(lái)已來(lái)

再啰嗦一句,AI的強(qiáng)大這里就不再?gòu)?qiáng)調(diào)了 ,接下來(lái)我會(huì)持續(xù)利用GPT輸出很多干貨和其他AI生態(tài)的東西,都收在下方的AI專(zhuān)欄里,一起學(xué)習(xí),一起成長(zhǎng),用一句話作為結(jié)尾吧: 將來(lái)淘汰你的不是AI,而是不會(huì)用AI的人

以上就是兩天沒(méi)解決的問(wèn)題chatgpt用了5秒搞定的詳細(xì)內(nèi)容,更多關(guān)于chatgpt 5秒解決問(wèn)題的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java包機(jī)制及javadoc詳解

    Java包機(jī)制及javadoc詳解

    為了更好地組織類(lèi),Java提供了包機(jī)制,用于區(qū)別類(lèi)名的命名空間,一般利用公司域名倒置作為包名,這篇文章主要介紹了Java包機(jī)制以及javadoc,需要的朋友可以參考下
    2022-10-10
  • MyBatis加解密插件的示例詳解

    MyBatis加解密插件的示例詳解

    本文介紹了使用?MyBatis?插件實(shí)現(xiàn)數(shù)據(jù)庫(kù)字段加解密的探索過(guò)程,實(shí)際開(kāi)發(fā)過(guò)程中需要注意的細(xì)節(jié)比較多,整個(gè)流程下來(lái)我對(duì)?MyBatis?的理解也加深了,對(duì)MyBatis加解密插件感興趣的朋友跟隨小編一起看看吧
    2022-08-08
  • redis做服務(wù)間通信工具的項(xiàng)目示例

    redis做服務(wù)間通信工具的項(xiàng)目示例

    Redis是一種高效的服務(wù)間通信工具,它以鍵值對(duì)的形式存儲(chǔ)數(shù)據(jù),并支持多種數(shù)據(jù)類(lèi)型和豐富的操作,本文主要介紹了redis做服務(wù)間通信工具的項(xiàng)目示例,感興趣的可以了解一下
    2023-08-08
  • Java?JSON處理庫(kù)之Gson的用法詳解

    Java?JSON處理庫(kù)之Gson的用法詳解

    Gson是Google開(kāi)發(fā)的一款Java?JSON處理庫(kù),旨在簡(jiǎn)化Java開(kāi)發(fā)人員操作JSON數(shù)據(jù)的過(guò)程,本文就來(lái)和大家簡(jiǎn)單聊聊Gson的原理與具體使用吧
    2023-05-05
  • 關(guān)于RestTemplate中的Get請(qǐng)求

    關(guān)于RestTemplate中的Get請(qǐng)求

    這篇文章主要介紹了關(guān)于RestTemplate中的Get請(qǐng)求,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringBoot+Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡的示例代碼

    SpringBoot+Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡的示例代碼

    這篇文章主要介紹了SpringBoot+Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • SpringBoot?整合RabbitMq?自定義消息監(jiān)聽(tīng)容器來(lái)實(shí)現(xiàn)消息批量處理

    SpringBoot?整合RabbitMq?自定義消息監(jiān)聽(tīng)容器來(lái)實(shí)現(xiàn)消息批量處理

    Spring Boot中提供了默認(rèn)的監(jiān)聽(tīng)器容器,但是有時(shí)候我們需要自定義監(jiān)聽(tīng)器容器,來(lái)滿足一些特殊的需求,比如批量獲取數(shù)據(jù),這篇文章主要介紹了SpringBoot?整合RabbitMq?自定義消息監(jiān)聽(tīng)容器來(lái)實(shí)現(xiàn)消息批量處理,需要的朋友可以參考下
    2023-04-04
  • Java使用FileReader讀取文件詳解

    Java使用FileReader讀取文件詳解

    本文將為大家介紹FileReader類(lèi)的基本用法,包括如何創(chuàng)建FileReader對(duì)象,如何讀取文件,以及如何關(guān)閉流,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-09-09
  • Java中Map集合的常用方法(非常詳細(xì)!)

    Java中Map集合的常用方法(非常詳細(xì)!)

    Java中的Map是一種鍵值對(duì)存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu),它提供了快速查找和訪問(wèn)數(shù)據(jù)的能力,下面這篇文章主要給大家介紹了關(guān)于Java中Map集合的常用方法,需要的朋友可以參考下
    2024-01-01
  • Spring Security如何在Servlet中執(zhí)行

    Spring Security如何在Servlet中執(zhí)行

    這篇文章主要介紹了Spring Security如何在Servlet中執(zhí)行,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論

社会| 海林市| 威宁| 巴林右旗| 石嘴山市| 黑龙江省| 韩城市| 青铜峡市| 南部县| 福泉市| 唐海县| 塔河县| 松阳县| 萍乡市| 黑山县| 金塔县| 凤翔县| 吉安县| 太原市| 迁安市| 罗江县| 商城县| 岫岩| 墨竹工卡县| 辽阳市| 阜南县| 霸州市| 故城县| 定安县| 鄂温| 南康市| 渭南市| 玉龙| 金乡县| 中山市| 山西省| 呼玛县| 漳平市| 庄浪县| 武威市| 新营市|