1. 程式人生 > >多執行緒訪問HashMap容易犯的錯誤

多執行緒訪問HashMap容易犯的錯誤

多執行緒對HashMap的訪問有一個容易犯的錯誤描述如下:HashMap做為一個成員變數通過介面被多個執行緒獲取訪問,在一個執行緒中更新修改,如果讀執行緒和寫執行緒訪問的是同一個成員變數,而且執行緒間沒有同步,就會導致資料異常甚至程式崩潰。即使通過執行緒同步保證對hashmap的讀寫是序列,也不是很好的方法,一是要使用全域性的鎖保證執行緒間的互斥,開銷比較大,二是全域性鎖會造成讀或寫執行緒的阻塞等待,體驗也不是很好。所以最好的解決方法是,讀寫hashmap的執行緒不要訪問同一個hashmap物件,修改hashmap的執行緒在需要對hashmap更新或修改時,建立一個新的hashmap物件,等到修改完畢再將新建立的hashmap賦值給成員變數,這樣通過介面獲取到hashmap的執行緒,訪問的仍然是之前的hashmap,等到下次重新訪問時才會使用最新的修改的hashmap,這樣雖然會導致其他讀執行緒訪問的可能不是最新的hashmap,但體驗上和開銷上是最小的。

更新hashmap的類描述如下:

import java.util.HashMap;


public class UpdateThread {

    private HashMap<String,String> mHashMap;

    private void updateHashMap(){
        new Thread(new Runnable() {

            @Override
            public void run() {
                HashMap<String,String> hashMap = new
HashMap<String,String>(); //開始更新hashmap hashMap.put("test1", "test1"); //更新hashmap完成 mHashMap = hashMap;//更新換再賦值 } }).start(); } public HashMap<String,String> getHashMap(){ return mHashMap; } }