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

基于Java HashMap的死循環(huán)的啟示詳解

 更新時間:2013年05月13日 11:43:23   作者:  
本篇文章是對Java HashMap的死循環(huán)進行了詳細的分析介紹,需要的朋友參考下

一、單線程改造為多線程也是個技術(shù)活

正如我們看到耗子叔叔博客里寫的那樣,原來是單線程的應(yīng)用程序,”后來,我們的程序性能有問題,所以需要變成多線程的,于是,變成多線程后到了線上,發(fā)現(xiàn)程序經(jīng)常占了100%的CPU“。

考慮到是淘寶的工程師曝出來的問題,他們的技術(shù)基礎(chǔ)一般都很扎實,連他們都用錯了,所以把單線程改造為多線程并不是想象中的那么簡單,我認(rèn)為。

你可能很不服氣地反問,淘寶的工程師又怎么了,單線程改為多線程有什么難的?無非就是應(yīng)用現(xiàn)有的多線程技術(shù)嘛,你看,我有非常強烈的線程安全意識,我知道同步、死鎖、競態(tài)條件,還知道lock free和線程安全容器,還知道各種線程安全同步構(gòu)造……難道還寫不出線程安全的應(yīng)用程序?

實際情況是,線程安全的應(yīng)用程序并不一定因為你有扎實的線程安全基礎(chǔ)和開發(fā)經(jīng)驗就能夠?qū)懞玫摹?/P>

試著舉兩個例子:

1、使用線程安全容器通過索引取數(shù)據(jù)

很多人知道的線程安全容器,實際使用的時候并不一定不出現(xiàn)BUG,下面的(有隱患的)代碼就比較典型:

復(fù)制代碼 代碼如下:

        static int GetFirstOrDefault(ThreadSafeList<int> list)
        {
            if (list.Count > 0)
            {
                return list[0];
            }
            return 0;
        }

上面的函數(shù)參數(shù)list如果一開始傳入一個元素總數(shù)為1的列表,大家能分析出上面的代碼會有什么問題嗎?

關(guān)于線程安全容器,之前我恰好也總結(jié)過一篇文章<深入線程安全容器的實現(xiàn)方法>。線程安全容器并不真正安全,上面有問題的代碼就是出自于這里。

 

2、多線程操作郵件的失誤

還有就是多線程應(yīng)用場景的分析可能不正確,曾經(jīng)因為一個郵件收發(fā)程序的性能問題,我也大膽改造過應(yīng)用程序,改來改去就出現(xiàn)了重大BUG,

大家可以看看我痛心疾首總結(jié)過的<基于一個應(yīng)用程序多線程誤用的分析詳解>。

 

上面舉的這兩個例子,我只是想說明,多線程應(yīng)用程序中,因為線程安全產(chǎn)生的BUG其實是很微妙的,一個考慮不周或者認(rèn)識不夠深刻,出現(xiàn)問題的可能性簡直防不勝防。

二、ReHash的代價

上面第一點主要是閑談線程安全,接著我們也說說哈希表,深刻理解消耗成本很大的ReHash。

我們平常理解中的哈希表是“以空間換時間的一種數(shù)據(jù)結(jié)構(gòu)”。這樣說的太久了,大家可能會有一種直觀上的錯覺,就是哈希表犧牲的是空間,爭取的是時間。

但是,ReHash的過程其實是空間和時間的雙重重大損失,因為分析源代碼,我們知道ReHash的過程其實就是一個動態(tài)擴容的過程,而哈希表的擴容是個空間和時間消耗都非常驚人的內(nèi)部操作。

為什么說ReHash是個空間和時間消耗都非常驚人的內(nèi)部操作呢?

1、原來當(dāng)我們對哈希結(jié)構(gòu)的容器進行擴容時,散列表內(nèi)部要重新new一個更大的數(shù)組,然后把原來數(shù)組的內(nèi)容拷貝到新數(shù)組,并進行重新散列;

2、new出來的這個更大的新數(shù)組容量有多大也是一門學(xué)問,一般來說,新數(shù)組的大小會設(shè)置成原數(shù)組雙倍大小的相近的一個素數(shù)(.NET中這個素數(shù)的生成還有一定的技巧)。

從1和2這兩點可以看出,ReHash的代價確實非常高。在不久以前我碰巧寫過一篇關(guān)于.NET容器的動態(tài)擴容的文章<解析從源碼分析常見的基于Array的數(shù)據(jù)結(jié)構(gòu)動態(tài)擴容機制的詳解>,其中也淺顯總結(jié)了.NET的HashTable的擴容機制,現(xiàn)在對照J(rèn)ava中的HashMap源碼,看到熟悉的ReHash函數(shù)命名,再看一遍.NET中的實現(xiàn),果然有比較才能有提高。

至于我們平時所理解的“以空間換時間“,其實是指哈希具有O(1)復(fù)雜度的數(shù)據(jù)檢索效率,但它受填充因子影響,空間開銷通常很大,空間利用率不高。

所以我們常常說哈希表適用于讀操作頻繁,寫操作較少應(yīng)用場景,比如把哈希表當(dāng)做緩存容器,于我心有戚戚焉。

最后看到這句“有人把這個問題報給了Sun,不過Sun不認(rèn)為這個是一個問題。因為HashMap本來就不支持并發(fā)。要并發(fā)就用ConcurrentHashmap…”

根據(jù)實際開發(fā)經(jīng)驗,線程安全的容器并不真正線程安全,會用ConcurrentHashmap也只是進入初級階段,同時忍不住要感慨下當(dāng)年如日中天風(fēng)光無限的Sun。

相關(guān)文章

  • Java如何實現(xiàn)多個線程之間共享數(shù)據(jù)

    Java如何實現(xiàn)多個線程之間共享數(shù)據(jù)

    這篇文章主要介紹了Java如何實現(xiàn)多個線程之間共享數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java實現(xiàn)的漢語拼音工具類完整實例

    Java實現(xiàn)的漢語拼音工具類完整實例

    這篇文章主要介紹了Java實現(xiàn)的漢語拼音工具類,結(jié)合完整實例形式分析了java基于pinyin4j包實現(xiàn)編碼轉(zhuǎn)換的相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • Java中的函數(shù)式編程

    Java中的函數(shù)式編程

    這篇文章介紹Java中的函數(shù)式編程,函數(shù)式編程是一種編程范式,其中程序是通過應(yīng)用和組合函數(shù)來構(gòu)造的。它是一種聲明式編程范式,其中函數(shù)定義是表達式樹,每個表達式樹返回一個值,而不是一系列改變程序狀態(tài)的命令語句,具體情況請看下文,希望對你有所幫助
    2021-10-10
  • SpringCloud Feign服務(wù)調(diào)用請求方式總結(jié)

    SpringCloud Feign服務(wù)調(diào)用請求方式總結(jié)

    這篇文章主要介紹了SpringCloud Feign服務(wù)調(diào)用方式總結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • java實現(xiàn)爬蟲爬網(wǎng)站圖片的實例代碼

    java實現(xiàn)爬蟲爬網(wǎng)站圖片的實例代碼

    這篇文章主要介紹了java實現(xiàn)爬蟲爬網(wǎng)站圖片的實例代碼,需要的朋友可以參考下
    2018-06-06
  • MyBatis Log Free插件IDE下載與使用方式

    MyBatis Log Free插件IDE下載與使用方式

    這篇文章主要介紹了MyBatis Log Free插件IDE下載與使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java編程讀寫鎖詳解

    Java編程讀寫鎖詳解

    本篇文章給大家詳細分享了Java編程讀寫鎖的相關(guān)原理以及知識點內(nèi)容,有興趣的朋友們可以參考下。
    2018-08-08
  • 詳解Springboot之接收json字符串的兩種方式

    詳解Springboot之接收json字符串的兩種方式

    這篇文章主要介紹了Springboot之接收json字符串的兩種方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • springBoot2.6.2自動裝配之注解源碼解析

    springBoot2.6.2自動裝配之注解源碼解析

    對于springboot個人認(rèn)為它就是整合了各種組件,然后提供對應(yīng)的自動裝配和啟動器(starter),基于這個流程去實現(xiàn)一個定義的裝配組件,下面這篇文章主要給大家介紹了關(guān)于springBoot2.6.2自動裝配之注解源碼解析的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • 淺談java中的路徑表示

    淺談java中的路徑表示

    下面小編就為大家?guī)硪黄獪\談java中的路徑表示。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04

最新評論

岳阳县| 万山特区| 新蔡县| 宝鸡市| 洪洞县| 保亭| 青海省| 洞口县| 贵溪市| 望江县| 上虞市| 定日县| 湾仔区| 进贤县| 自治县| 杭州市| 宁远县| 安化县| 英超| 工布江达县| 新平| 子长县| 通城县| 安康市| 伊宁县| 太康县| 赤城县| 青神县| 平塘县| 五常市| 白玉县| 区。| 阿合奇县| 齐齐哈尔市| 临城县| 社会| 牙克石市| 洪湖市| 南阳市| 阜阳市| 海宁市|