關於hashmap,其實在jdk1.8和1.7版本之間的差別還是蠻大的,這幾天在經過認真分析和理解之後,通過實驗將學習成果進行展示。
首先提出乙個問題:jdk1.7多執行緒環境下hashmap容易出現死迴圈?
public class hashmaptest
} class hashmapthread extends thread
}}
請自行執行這段**,模擬迴圈死鎖現象。其實原理就是同時啟動多個執行緒,不斷進行put操作。
void transfer(entry newtable, boolean rehash)
int i = indexfor(e.hash, newcapacity);
e.next = newtable[i];
newtable[i] = e;
e = next;}}
}
final v putval(int hash, k key, v value, boolean onlyifabsent,
2 boolean evict)
23 if (e.hash == hash &&
24 ((k = e.key) == key || (key != null && key.equals(k))))
25 break;
26 p = e;
27 }
28 }
30 v oldvalue = e.value;
31 if (!onlyifabsent || oldvalue == null)
32 e.value = value;
33 afternodeaccess(e);
34 return oldvalue;
35 }
36 }
37 ++modcount;
38 if (++size > threshold)
39 resize();
40 afternodeinsertion(evict);
41 return null;
42 }
這是jdk1.8中hashmap中put操作的主函式, 注意第6行**,如果沒有hash碰撞則會直接插入元素。如果執行緒a和執行緒b同時進行put操作,剛好這兩條不同的資料hash值一樣,並且該位置資料為null,所以這執行緒a、b都會進入第6行**中。假設一種情況,執行緒a進入後還未進行資料插入時掛起,而執行緒b正常執行,從而正常插入資料,然後執行緒a獲取cpu時間片,此時執行緒a不用再進行hash判斷了,問題出現:執行緒a會把執行緒b插入的資料給覆蓋,發生執行緒不安全。
另外區別:再新版本中煉表長度達到一定長度時,會自動轉化為紅黑樹。
不同jquery外掛程式 版本不同造成的問題
最近在開發中遇到乙個問題 我在同乙個頁面已用了兩個jquery外掛程式,但是這兩個外掛程式使用的jquery版本不同,所以總是不能同時生效。第乙個想法是找乙個都可以用的版本,但是我從1.幾版本到3.幾都試了,返現並不好使 說好的向下相容性呢 於是我想到了或許使用iframe可以實現。iframe i...
解決MySQL安裝的版本不同
解決mysql 安裝的 版本不同 1 登入mysql mysql u root 使用者名稱 p2 輸入密碼 root root 自己設定的密碼3 show databases 顯示資訊 show databases4 select user,plugin from mysql.user 進入mysq...
JDK7和JDK8中HashMap版本有什麼不同?
hashmap底層是陣列,稱為雜湊桶,儲存結構 jdk7是陣列 鍊錶,jdk8 是陣列 鍊錶 紅黑樹。1 鍊錶插入方式的不同 在1.7之前,鍊錶元素的插入採用的是頭插法,也就是說,當有新結點進來時,會在插入在鍊錶的頭部。很明顯,由於不用遍歷鍊錶,這種插入方式的效率是更高的。但是1.8之後,因為當結點...