了解有关线程和并发的更多信息,并考虑使用常规哈希表和ConcurrentHashMap。
测试这些哈希表的并发性的好方法是什么?
(显然哈希表将无法通过此测试)
如果我能以某种方式跟踪测试执行的次数,以便更快地查看哪一个(ht或并发ht),那将会很酷。
答案 0 :(得分:8)
这是您上次编辑有关如何测试它的答案。这也涉及Hot Licks的评论。在实践中,您无法真正测试线程安全性,因为它非常不确定,故障通常会在很长一段时间内发生。
有一个nice race condition带有非线程安全的HashMap。具有多个线程的put
进入HashMap会导致它进入无限循环。运行与此类似的代码
ExecutorService e = Executors.newFixedThreadPool(5);
public void test(final Map<Object,Object> map){
for(int i =0; i < 5000; i++){
e.submit(new Runnable(){
public void run(){
map.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
注意我之所以使用,可能是因为你可以多次运行这个测试,而不是进入无限循环,但是我已经完成了这个测试并且很容易让循环发生