日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

面試必問—幾種線程安全的Map解析

 諤諤熱 2017-08-07

HashMap線程安全的嗎?

Java中平時用的最多的Map集合就是HashMap了,它是線程不安全的。

看下面兩個場景:

1、當(dāng)用在方法內(nèi)的局部變量時,局部變量屬于當(dāng)前線程級別的變量,其他線程訪問不了,所以這時也不存在線程安全不安全的問題了。

2、當(dāng)用在單例對象成員變量的時候呢?這時候多個線程過來訪問的就是同一個HashMap了,對同個HashMap操作這時候就存在線程安全的問題了。

面試必問—幾種線程安全的Map解析

線程安全的Map

為了避免出現(xiàn)場景2的線程安全的問題,不能使用HashMap作為成員變量,要尋求使用線程安全的Map,下面來總結(jié)下有哪些線程安全的Map呢?

1、HashTable

private Map map = new Hashtable<>();

來看看HashTable的源碼

面試必問—幾種線程安全的Map解析

面試必問—幾種線程安全的Map解析

HashTable的get/put方法都被synchronized關(guān)鍵字修飾,說明它們是方法級別阻塞的,它們占用共享資源鎖,所以導(dǎo)致同時只能一個線程操作get或者put,而且get/put操作不能同時執(zhí)行,所以這種同步的集合效率非常低,一般不建議使用這個集合。

2、SynchronizedMap

private Map map = Collections.synchronizedMap(new HashMap());

這種是直接使用工具類里面的方法創(chuàng)建SynchronizedMap,把傳入進(jìn)行的HashMap對象進(jìn)行了包裝同步而已,來看看它的源碼。

面試必問—幾種線程安全的Map解析

這個同步方式實(shí)現(xiàn)也比較簡單,看出SynchronizedMap的實(shí)現(xiàn)方式是加了個對象鎖,每次對HashMap的操作都要先獲取這個mutex的對象鎖才能進(jìn)入,所以性能也不會比HashTable好到哪里去,也不建議使用。

3、ConcurrentHashMap - 推薦

private Map map = new ConcurrentHashMap<>();

這個也是最推薦使用的線程安全的Map,也是實(shí)現(xiàn)方式最復(fù)雜的一個集合,每個版本的實(shí)現(xiàn)方式也不一樣,在jdk8之前是使用分段加鎖的一個方式,分成16個桶,每次只加鎖其中一個桶,而在jdk8又加入了紅黑樹和CAS算法來實(shí)現(xiàn)。

面試必問—幾種線程安全的Map解析

雖然實(shí)現(xiàn)起來很復(fù)雜,但使用起來也是非常簡單的,在java面試中問的頻率也非常高,最重要的是性能要比上面兩種同步方式要快太多,推薦使用。

代碼及所有資源請加java群274435854下載,我們一起學(xué)習(xí)交流。

架構(gòu)之路,頭條精選,每天一篇干貨,喜歡就收藏+關(guān)注吧!

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多