HashMap不是執行緒安全的,ConcurrentHashMap則在某一個方法的執行上是執行緒安全的。
package testMap; import java.util.HashMap; public class TestHashMapSync { public static final HashMap<String, String> map=new HashMap<String, String>(); public static void main(String[] args) throws InterruptedException { Thread t1=new Thread(){ public void run() { for(int i=0;i<25;i++){ map.put(String.valueOf(i), String.valueOf(i)); } } }; Thread t2=new Thread(){ public void run() { for(int j=25;j<50;j++){ map.put(String.valueOf(j), String.valueOf(j)); } } }; t1.start(); t2.start(); //等待執行緒結束 t1.join(); t2.join(); for(int l=0;l<50;l++){ //如果key和value不同,說明在兩個執行緒put的過程中出現異常。 if(!String.valueOf(l).equals(map.get(String.valueOf(l)))){ System.err.println(String.valueOf(l)+":"+map.get(String.valueOf(l))); } } } }
如果是HashMap,put的時候兩個執行緒有一定機率互相干擾,如果是ConcurrentHashMap,則不會干擾。
以上程式碼HashMap改為ConcurrentHashMap就不會異常了。
詳細資訊可以參考一下這篇部落格:http://blog.csdn.net/weibin_6388/article/details/43231207