只是学习更多关于线程和并发性的知识,并想到使用常规散列表和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