2011-12-19 51 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