這篇文章主要介紹“安全的Map線程有哪些”,在日常操作中,相信很多人在安全的Map線程有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”安全的Map線程有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
公司主營業(yè)務:成都做網(wǎng)站、網(wǎng)站建設、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出譙城免費做網(wǎng)站回饋大家。
HashMap線程安全的嗎?
Java中平時用的最多的Map集合就是HashMap了,它是線程不安全的。
看下面兩個場景:
1、當用在方法內的局部變量時,局部變量屬于當前線程級別的變量,其他線程訪問不了,所以這時也不存在線程安全不安全的問題了。
2、當用在單例對象成員變量的時候呢?這時候多個線程過來訪問的就是同一個HashMap了,對同個HashMap操作這時候就存在線程安全的問題了。
線程安全的Map
為了避免出現(xiàn)場景2的線程安全的問題,不能使用HashMap作為成員變量,要尋求使用線程安全的Map,下面來總結下有哪些線程安全的Map呢?
1、HashTable
private Map
來看看HashTable的源碼
HashTable的get/put方法都被synchronized關鍵字修飾,說明它們是方法級別阻塞的,它們占用共享資源鎖,所以導致同時只能一個線程操作get或者put,而且get/put操作不能同時執(zhí)行,所以這種同步的集合效率非常低,一般不建議使用這個集合。
2、SynchronizedMap
private Map
這種是直接使用工具類里面的方法創(chuàng)建SynchronizedMap,把傳入進行的HashMap對象進行了包裝同步而已,來看看它的源碼。
這個同步方式實現(xiàn)也比較簡單,看出SynchronizedMap的實現(xiàn)方式是加了個對象鎖,每次對HashMap的操作都要先獲取這個mutex的對象鎖才能進入,所以性能也不會比HashTable好到哪里去,也不建議使用。
3、ConcurrentHashMap - 推薦
private Map
這個也是最推薦使用的線程安全的Map,也是實現(xiàn)方式最復雜的一個集合,每個版本的實現(xiàn)方式也不一樣,在jdk8之前是使用分段加鎖的一個方式,分成16個桶,每次只加鎖其中一個桶,而在jdk8又加入了紅黑樹和CAS算法來實現(xiàn)。
雖然實現(xiàn)起來很復雜,但使用起來也是非常簡單的,在java面試中問的頻率也非常高,最重要的是性能要比上面兩種同步方式要快太多,推薦使用。
到此,關于“安全的Map線程有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
分享文章:安全的Map線程有哪些
瀏覽地址:http://weahome.cn/article/jiichj.html