国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

案例15-ArrayList線程不安全,共用全局變量導(dǎo)致數(shù)據(jù)錯亂問題,占用內(nèi)存情況

這篇具有很好參考價值的文章主要介紹了案例15-ArrayList線程不安全,共用全局變量導(dǎo)致數(shù)據(jù)錯亂問題,占用內(nèi)存情況。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

背景

存入redis的值,可能會出現(xiàn)錯誤的情況。如果出現(xiàn)錯誤,接口將會報錯。
多個方法一起修改一個公共變量的值,造成數(shù)據(jù)混亂,導(dǎo)致存入redis中的key值錯誤
還有每次登陸都會重現(xiàn)創(chuàng)建一個對象,放到公共變量中,遇到并發(fā),對象會被大量地創(chuàng)建,
上一個對象會失去引用,等待垃圾回收器進行回收,導(dǎo)致CPU飆升。

arraylist內(nèi)存占用較多,java,jvm,算法
上邊公共變量的字符串拼接出現(xiàn)問題,導(dǎo)致下邊這張圖中的域名中的字符串出現(xiàn)問題。

arraylist內(nèi)存占用較多,java,jvm,算法
arraylist內(nèi)存占用較多,java,jvm,算法
arraylist內(nèi)存占用較多,java,jvm,算法
由上圖可知:

**1、使用了線程不安全的ArrayList作為公共變量
2、每次給Arraylist重新賦值的時候都創(chuàng)建了一個新的對象,堆積了大量要回收的舊對象,導(dǎo)致CPU飆升**

(GC會消耗大量CPU和內(nèi)存來實現(xiàn)垃圾回收)

思路&方案

復(fù)現(xiàn)問題:

測試類:

public class ThreadTest {
    //新建一個list作為成員變量
    List<String> testList ;

    public void updateTestList(){
        testList = new ArrayList<>();
        testList.add("a01+");
        testList.add("a02+");
        testList.add("a03+");
        testList.add("a04+");

        //打印一下看看有什么
        System.out.println("updateTestList"+testList);

    }


    public void updateTestList2(){
        testList = new ArrayList<>();
        testList.add("b01+");
        testList.add("b02+");
        testList.add("b03+");
        testList.add("b04+");

        //看一下list里有什么
        System.out.println("updateTestList2"+testList);
    }
}

客戶端:

public class Main {
    public static void main(String[] args) {

        ThreadTest threadTest = new ThreadTest();

        //開一個多線程測試一下
        for (int i = 0; i < 100; i++) {
          Thread thread = new Thread(new Runnable() {
              @Override
              public void run() {
                  threadTest.updateTestList();
                  threadTest.updateTestList2();
              }
          });
        thread.start();
        }
    }
}

正常結(jié)果只會出現(xiàn)下面兩種情況
updateTestList[a01+, a02+, a03+, a04+]
updateTestList2[b01+, b02+, b03+, b04+]

實際上:
arraylist內(nèi)存占用較多,java,jvm,算法

注重變量的作用域和生命周期,還要考慮并發(fā)量高的時候考慮線程安全,并發(fā)的時候還要將對象進行置空。

第一個問題解決方案:

1、在方法之前加 synchronized 關(guān)鍵字。

arraylist內(nèi)存占用較多,java,jvm,算法

2、使用ThreadLocal變量。
public class ThreadTest2 {

    ThreadLocal<List<String>> testList = ThreadLocal.withInitial(()->new ArrayList<>());

    public  void updateTestList(){
        testList.get().removeAll(testList.get());
        testList.get().add("a01+");
        testList.get().add("a02+");
        testList.get().add("a03+");
        testList.get().add("a04+");

        //打印一下看看有什么
        System.out.println("updateTestList"+testList.get());

    }


    public  void updateTestList2(){
        testList.get().removeAll(testList.get());
        testList.get().add("b01+");
        testList.get().add("b02+");
        testList.get().add("b03+");
        testList.get().add("b04+");

        //看一下list里有什么
        System.out.println("updateTestList2"+testList.get());
    }
}

結(jié)果:
arraylist內(nèi)存占用較多,java,jvm,算法

第二個問題(對象重復(fù)創(chuàng)建導(dǎo)致CPU和內(nèi)存飆升)解決方案:
1、使用List的RemoveAll方法將對象進行清除。
現(xiàn)狀:arraylist內(nèi)存占用較多,java,jvm,算法
arraylist內(nèi)存占用較多,java,jvm,算法

這樣就不會持續(xù)開辟內(nèi)存空間。

總結(jié)

考慮成本,凡事都要考慮成本。
我們要有無限思維,當(dāng)只有一個對象的時候我們寫的代碼不會出現(xiàn)上述問題,但是對象一多就會出現(xiàn)數(shù)據(jù)錯亂的問題,內(nèi)存飆升的問題,我們的系統(tǒng)不會只有一個用戶,所以無限思維是我們必須要考慮的一件事情,考慮并發(fā),考慮將來。而不是只顧眼前。

并發(fā)如何解決?

并發(fā)問題是在多線程或多進程環(huán)境中經(jīng)常出現(xiàn)的挑戰(zhàn),可能導(dǎo)致數(shù)據(jù)不一致、死鎖等問題。解決并發(fā)問題需要考慮各種技術(shù)和策略,下面是一些常見的方法:

鎖機制: 使用鎖是解決并發(fā)問題的一種常見方法。通過在關(guān)鍵代碼段周圍加鎖,只允許一個線程或進程訪問臨界資源,從而防止多個線程同時修改相同數(shù)據(jù)。然而,鎖可能導(dǎo)致死鎖和性能問題,因此需要小心設(shè)計和管理。

同步機制: 同步方法如synchronized塊或方法可以確保在同一時間只有一個線程可以訪問共享資源。這有助于避免數(shù)據(jù)競爭和不一致問題。

并發(fā)容器: Java提供了許多并發(fā)容器,如ConcurrentHashMap、ConcurrentLinkedQueue等,這些容器在多線程環(huán)境中提供了更好的性能和線程安全性。

原子操作: 原子操作是不可分割的操作,可以確保多線程環(huán)境中的數(shù)據(jù)一致性。Java提供了一些原子類,如AtomicInteger、AtomicReference等,用于執(zhí)行原子操作。

線程池: 使用線程池可以有效地管理并發(fā)任務(wù)。線程池可以控制線程的數(shù)量,從而減少線程創(chuàng)建和銷毀的開銷,提高性能和資源利用率。

避免共享狀態(tài): 盡量避免共享狀態(tài),通過將狀態(tài)封裝在對象中,每個線程操作自己的對象實例,從而避免競爭和并發(fā)問題。

使用不可變對象: 不可變對象在多線程環(huán)境中是線程安全的,因為它們不會改變。使用不可變對象可以避免并發(fā)問題。

內(nèi)存模型和可見性: 了解Java內(nèi)存模型和可見性原則,確保一個線程對共享變量的修改對其他線程可見。

死鎖避免和解決: 死鎖是一種并發(fā)問題,當(dāng)多個線程互相等待對方釋放資源時發(fā)生。避免死鎖可以通過破壞四個必要條件之一來實現(xiàn):互斥、持有并等待、不可搶占、循環(huán)等待。

并發(fā)工具: Java提供了許多并發(fā)工具,如CountDownLatch、CyclicBarrier、Semaphore等,用于協(xié)調(diào)多個線程的執(zhí)行和等待。

總之,解決并發(fā)問題需要綜合考慮設(shè)計、同步、數(shù)據(jù)管理和線程控制等方面。選擇適當(dāng)?shù)牟呗院图夹g(shù)取決于問題的復(fù)雜性和性能要求。同時,良好的并發(fā)編程實踐也需要深入了解多線程和并發(fā)編程的原則。文章來源地址http://www.zghlxwxcb.cn/news/detail-783528.html

到了這里,關(guān)于案例15-ArrayList線程不安全,共用全局變量導(dǎo)致數(shù)據(jù)錯亂問題,占用內(nèi)存情況的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Jmeter(二十七):BeanShell PostProcessor跨線程全局變量使用

    Jmeter(二十七):BeanShell PostProcessor跨線程全局變量使用

    在性能測試中,兩個相關(guān)聯(lián)的接口不一定都在同一個線程組,遇見這種情況時,我們要進行跨線程組傳參,此處用登錄和查詢配送單兩個請求舉例; 1、登錄請求中配置json提取器,將接口返回的token保存在變量中; ?2、登錄請求中配置BeanShell 后置處理程序,將token保存到全局

    2024年02月11日
    瀏覽(32)
  • C++多線程場景中的變量提前釋放導(dǎo)致棧內(nèi)存異常

    C++多線程場景中的變量提前釋放導(dǎo)致棧內(nèi)存異常

    在子線程中嘗試使用當(dāng)前函數(shù)的資源 ,是非常危險的,但是C++支持這么做。因此C++這么做可能會造成棧內(nèi)存異常。 上述是一個正常的多線程代碼。 但是如果將其中多線程傳參設(shè)置為引用傳遞,可能就會造成棧內(nèi)存異常了,如下所示: 編譯成功,但是運行失敗。 運行結(jié)果:

    2024年02月13日
    瀏覽(43)
  • 單線程、同步、異步、預(yù)解析、作用域、隱式全局變量、對象創(chuàng)建、new

    單線程、同步、異步、預(yù)解析、作用域、隱式全局變量、對象創(chuàng)建、new

    cpu 資源分配的最小單位 一個進程可以有多個線程 cpu 調(diào)度的最小單位 線程建立在進程的建立基礎(chǔ)上的一次程序的運行單位 線程分為:單線程 多線程 單線程:js是單線程 (同一個時間只能完成一個任務(wù)) 多線程:百度是多線程 同步任務(wù)是指在主線程上排隊的任務(wù),只有當(dāng)前

    2024年01月22日
    瀏覽(56)
  • 面試官問 : ArrayList 不是線程安全的,為什么 ?(看完這篇,以后反問面試官)

    面試官問 : ArrayList 不是線程安全的,為什么 ?(看完這篇,以后反問面試官)

    金三銀四 ? 也許,但是。 近日,又收到金三銀四一線作戰(zhàn)小隊成員反饋的戰(zhàn)況 : 我不管你從哪里看的面經(jīng),但是我不允許你看到我這篇文章之后,還不清楚這個面試問題。 本篇內(nèi)容預(yù)告: ? ArrayList 是線程不安全的, 為什么 ? ① 結(jié)合代碼去探一探所謂的不安全? ② 我們

    2024年02月02日
    瀏覽(20)
  • JavaEE 初階篇-線程安全的集合類、多線程環(huán)境使用 ArrayList、隊列、哈希表(HashMap 、ConCurrentHashMap 、HashTable 的區(qū)別)

    JavaEE 初階篇-線程安全的集合類、多線程環(huán)境使用 ArrayList、隊列、哈希表(HashMap 、ConCurrentHashMap 、HashTable 的區(qū)別)

    ??博客主頁:?【 小扳_-CSDN博客】 ?感謝大家點贊??收藏?評論? ? 文章目錄 ? ? ? ? 1.0 線程安全的集合類 ? ? ? ? 1.2?線程安全的集合類 - Vector ? ? ? ? 1.3 線程安全的集合類 - Stack ? ? ? ? 1.4 線程安全的集合類 - HashTable ? ? ? ? 2.0 多線程環(huán)境使用 ArrayList ? ? ? ?

    2024年04月25日
    瀏覽(59)
  • jmeter如何將提取到的token值設(shè)置為全局變量使其可以跨線程組使用

    jmeter如何將提取到的token值設(shè)置為全局變量使其可以跨線程組使用

    我們用到j(luò)meter去進行接口測試時,經(jīng)常會遇到要跨線程組使用變量的場景,下面用json提取器提取token值并設(shè)置為全局變量的方法做為示范: 需要用到的是: 線程組---http請求---json提取器----Beanshell取樣器 ;其他元件大家根據(jù)自己需要去配置即可,json提取器和正則表達式提取器

    2024年02月16日
    瀏覽(22)
  • Java【多線程基礎(chǔ)3】導(dǎo)致線程不安全的 4 種原因及解決方式

    Java【多線程基礎(chǔ)3】導(dǎo)致線程不安全的 4 種原因及解決方式

    ??各位讀者好, 我是小陳, 這是我的個人主頁 ??小陳還在持續(xù)努力學(xué)習(xí)編程, 努力通過博客輸出所學(xué)知識 ??如果本篇對你有幫助, 煩請點贊關(guān)注支持一波, 感激不盡 ?? 希望我的專欄能夠幫助到你: JavaSE基礎(chǔ): 基礎(chǔ)語法, 類和對象, 封裝繼承多態(tài), 接口, 綜合小練習(xí)圖書管理系統(tǒng)

    2024年02月02日
    瀏覽(24)
  • 【Java并發(fā)編程】變量的線程安全分析

    【Java并發(fā)編程】變量的線程安全分析

    1.成員變量和靜態(tài)變量是否線程安全? 如果他們沒有共享,則線程安全 如果被共享: 只有讀操作,則線程安全 有寫操作,則這段代碼是臨界區(qū),需要考慮線程安全 2.局部變量是否線程安全 局部變量是線程安全的 當(dāng)局部變量引用的對象則未必 如果給i對象沒有逃離方法的作用

    2024年02月08日
    瀏覽(91)
  • 【探索Linux】—— 強大的命令行工具 P.21(多線程 | 線程同步 | 條件變量 | 線程安全)

    【探索Linux】—— 強大的命令行工具 P.21(多線程 | 線程同步 | 條件變量 | 線程安全)

    在上一篇文章中,我們詳細探討了多線程編程的基礎(chǔ)概念,包括線程互斥、互斥鎖以及死鎖和資源饑餓等問題。我們了解到,在多線程環(huán)境下,為了防止數(shù)據(jù)競爭和保證程序的正確性,需要采用一定的同步機制來協(xié)調(diào)線程之間的執(zhí)行順序。本篇文章將繼續(xù)深入探討多線程編程

    2024年02月05日
    瀏覽(22)
  • new ArrayList 不當(dāng)導(dǎo)致 CPU 飆升。。

    new ArrayList 不當(dāng)導(dǎo)致 CPU 飆升。。

    來源:juejin.cn/post/7139202066362138654 昨天線上容器突然cpu飆升,也是第一次排查這種問題所以記錄一下~ 首先問題是這樣的,周五正在寫文檔,突然收到了線上報警,發(fā)現(xiàn)cpu占用達到了90多,上平臺監(jiān)控系統(tǒng)查看容器,在jvm監(jiān)控中發(fā)現(xiàn)有一個pod在兩個小時內(nèi)產(chǎn)生了61次youngGc一次

    2024年02月13日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包