【问题标题】:How can I test that ConcurrentHashMap is truly thread-safe?如何测试 ConcurrentHashMap 是否真正是线程安全的?
【发布时间】:2011-12-19 20:59:58
【问题描述】:

刚刚了解了有关线程和并发的更多信息,并想到了使用常规哈希表和 ConcurrentHashMap。

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

(显然哈希表会通过这个测试)

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

【问题讨论】:

  • 我可以告诉你,基本的哈希表会更快,但代价显然是线程可能会破坏数据并使整个事情变得不一致......
  • 你永远无法测试安全性——你只能证明它不存在。
  • 你对 Hashtable 有误解:它是线程安全的。然而,它已被弃用并被 HashMap 取代,它不是线程安全的。
  • 那么我如何编写代码来测试这些条件,并使用类似的非线程安全数据结构(线程安全并发对应物)来解决这个问题?
  • 启动两个线程,一个增加映射中指定测试键的整数值,另一个读取它。或者尝试插入递增的键并观察其他线程看到它们出现的顺序。这不是一个合适的测试(因为这样的测试是不可能编写的),但它可能会展示可能发生的事情。

标签: java concurrency hashtable


【解决方案1】:

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

有一个带有非线程安全 HashMap 的 nice race condition。其中puting 进入具有多个线程的 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

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

【讨论】:

  • 这确实是一个美丽的比赛条件
  • 小建议:你的函数和参数同名(test
猜你喜欢
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 2014-03-04
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多