多線程下HashMap與Hashtable

最近在多線程環境下操做HashMap,在程序中執行最多的是「查詢」,但同時也要維護數據的「添加」和「刪除」安全

早在開發前就知道Hashtable是同步的,而HashMap是異步的。多線程

好吧在這裏認可錯誤:限於沒有犯過這個錯誤也沒有見過實例場景,開發前未作好評估異步

如今說說個人此次需求吧:性能

一、要求新增一個功能頁面,點擊功能按鈕彈出頁面spa

二、頁面先後臺校驗器兩個(在這裏不作追述)線程

三、提交修改後,提交按鈕並disabled該按鈕,頁面特定區域顯示動態Loading圖標,並要求不影響主功能進程,若關閉彈出頁面讓其後臺繼續執行。但執行結果再也不展現設計

以上是本次需求的大致內容,下面詳細說說需求點3使用HashMap出現的場景對象

設計思路是這樣的:進程

一、創建一個靜態私有的HashMap,並提供對外的get方法開發

二、給對象設置一個flag狀態:未獲得執行結果置爲false,得出執行結果置爲true

三、提交頁面將頁面對象傳遞到後臺,將原可編輯區域所有disabled,以對象Id作HashMap的Key,判斷HashMap中是否存在該Key,若存在則將正在執行的提示結果返回,若不存在則將該對象flag值置false添加到HashMap中並建立線程,主線程結束則啓動頁面定時器

四、線程任務執行完成後將HashMap中對應的對象flag置爲true

五、經過頁面定時器定時執行查詢HashMap,若flag爲true則將灰顯去除,動態Loading圖標隱藏,展現執行結果

六、當咱們提交頁面後線程任務正在執行,頁面仍然Loading狀態時關閉頁面(關閉頁面前中止頁面定時查詢)

七、再次打開該頁面並從新提交,頁面一直處於Loading狀態(線程死鎖)

八、當時的規避措施:在每次啓動線程前new 一個新對象而不使用當前對象

今天偶然中看到一篇Hashtable與HashMap的實例文章,讓我明白了當時HashMap中判斷Key是否存在後才建立線程的想法並無錯誤,只是線程中添加、刪除須要使用Hashtable

結論:看來在多線程的環境下,還得用Hashtable,雖然說HashMap的性能 能提升一些,可是由於自己是不一樣步的,因此不能使用在多線程下。固然,若是隻是在多線程下進行簡單的「查詢」,不對數據進行「添加」和「刪除」,那用 HashMap是能夠的,而且確定能提升性能的。

下面是我在網上搜索到的別人網友寫的一些相關內容:

一、若是線程要求安全,使用Vector,Hashtable

二、若是不要求線程安全,應使用ArrayList,LinkedList,HashMap

三、若是要求鍵值對,則使用HashMap、Hashtable

四、若是數據很大,又要線程安全考慮Vector


訪問效率最高的是ArrayList,HashTable次之
若是你會進行大量的插入/刪除操做,而不是對容器中的元素進行簡單的訪問,那就該用LinkedList了

在單線程下:vector和hashtable已經被ArrayList和hashMap代替,因此效率是最低的

相關文章
相關標籤/搜索