多執行緒訪問HashMap容易犯的錯誤
阿新 • • 發佈:2019-02-04
多執行緒對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;
}
}