最近在多線程環境下操做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代替,因此效率是最低的