只是學習更多關於線程和併發性的知識,並想到使用常規散列表和ConcurrentHashMap。如何測試ConcurrentHashMap是否是truley線程安全的?
什麼是測試這些哈希表的併發性的好方法?
(顯然哈希表將失敗此測試)
這將是冷靜,如果我還可以勉強保持跟蹤有多少讀/寫測試執行,看看哪一個(HT或conccurrent HT)更快。
只是學習更多關於線程和併發性的知識,並想到使用常規散列表和ConcurrentHashMap。如何測試ConcurrentHashMap是否是truley線程安全的?
什麼是測試這些哈希表的併發性的好方法?
(顯然哈希表將失敗此測試)
這將是冷靜,如果我還可以勉強保持跟蹤有多少讀/寫測試執行,看看哪一個(HT或conccurrent HT)更快。
這是您最後一次編輯有關如何測試它的答案。這也涉及熱舔評論。在實踐中,您不能真正測試線程安全性,因爲它非常不確定,而且失敗通常會在很長一段時間內發生。有一個nice race condition帶有非線程安全的HashMap。多個線程進入HashMap的哪個put
會導致它進入無限循環。運行與此類似
Executor e = Executors.newFixedThreadPool(5);
public void test(final Map<Object,Object> test){
for(int i =0; i < 5000; i++){
e.submit(new Runnable(){
public void run(){
test.put(new Object(),new Object());
}
});
}
}
test(new HashMap<Object,Object>()); //will probably go into an infinite loop
test(new ConcurrentHashMap<Object,Object>()); //will *never* go into an infinite loop
注意我大概用,因爲你可以運行這個測試的次數,而不是進入一個無限循環的代碼,但是我已經做了這個測試,並可以很容易地發生
循環這確實是一個美麗的競賽條件 – biziclop 2011-12-19 21:33:29
我可以告訴你,基本的散列表會更快,但成本顯然是線程可以摧毀數據,並使整個事情不一致... – 2011-12-19 21:02:51
信任道格利亞:) – Bozho 2011-12-19 21:06:14
你永遠不能測試的安全 - 你可以只能證明它不存在。 – 2011-12-19 21:11:01