java - 如何测试 ConcurrentHashMap 是否真正线程安全?

标签 java concurrency hashtable

只是了解有关线程和并发的更多信息,并考虑使用常规哈希表和 ConcurrentHashMap。

测试这些哈希表并发性的好方法是什么?

(显然哈希表将无法通过此测试)

如果我还可以以某种方式跟踪测试执行的读/写次数以查看哪一个(ht 或并发 ht)更快,那就太酷了。

最佳答案

这是对您上次编辑有关如何测试它的回答。这也涉及到 Hot Licks 的评论。在实践中,您无法真正测试线程安全性,因为它具有高度不确定性,并且故障通常会在很长一段时间内发生。

有一个nice race condition使用非线程安全的 HashMap。将多个线程放入 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

注意我使用可能是因为您可以多次运行此测试并且不会进入无限循环,但我已经完成了此测试并且可以轻松地让循环发生

关于java - 如何测试 ConcurrentHashMap 是否真正线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8567495/

相关文章:

Goroutines 选择范围循环

java - 如何使用二叉搜索树实现哈希表?

Java 泛型 : Array containing generics

c++ - 哈希表是否允许重复值?

java - 如何在某些 IDE 中调用对象的方法?

java - 如何使用 log4j 将错误消息和信息消息分别记录到系统日志中?

java - 我们可以查看JVM内存中的对象吗?

c++ - 如何使用 rand_r 以及如何以线程安全的方式使用它?

java - 使用wait和notify时避免死锁

java - 使用Reflections动态加载包中的所有类