2011-12-19 54 views
0

只是學習更多關於線程和併發性的知識,並想到使用常規散列表和ConcurrentHashMap。如何測試ConcurrentHashMap是否是truley線程安全的?

什麼是測試這些哈希表的併發性的好方法?

(顯然哈希表將失敗此測試)

這將是冷靜,如果我還可以勉強保持跟蹤有多少讀/寫測試執行,看看哪一個(HT或conccurrent HT)更快。

+0

我可以告訴你,基本的散列表會更快,但成本顯然是線程可以摧毀數據,並使整個事情不一致... – 2011-12-19 21:02:51

+3

信任道格利亞:) – Bozho 2011-12-19 21:06:14

+2

你永遠不能測試的安全 - 你可以只能證明它不存在。 – 2011-12-19 21:11:01

回答

6

這是您最後一次編輯有關如何測試它的答案。這也涉及熱舔評論。在實踐中,您不能真正測試線程安全性,因爲它非常不確定,而且失敗通常會在很長一段時間內發生。有一個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 

注意我大概用,因爲你可以運行這個測試的次數,而不是進入一個無限循環的代碼,但是我已經做了這個測試,並可以很容易地發生

循環
+1

這確實是一個美麗的競賽條件 – biziclop 2011-12-19 21:33:29