如何测试我对ConcurentHashMap的使用是否为线程安全?

qpgpyjmq  于 2022-10-01  发布在  Java
关注(0)|答案(1)|浏览(122)

我已经编写了下面的代码,并想测试它的并发性。即使我使用了ConcurrentHashMap,我也不确定代码是不是线程安全的,因为GET和UPDATE/REPLACE在不同的行上使用。有谁能建议如何测试这一点吗?

ConcurrentHashMap<String, int> somemap = new ConcurrentHashMap<>(); 
boolean some_method() {
    somemap.putifAbsent("somekey",value); 
    final int val = somemap.get("somekey");
    if(val < total_count) {
        val++;
    }
    somemap.replace("somekey", val);
}
wbrvyc0a

wbrvyc0a1#

有谁能建议如何测试这一点吗?

线程安全测试是不可靠的。原因是,编程语言或库的规范可能承诺,如果您的多线程程序遵守特定的规则,那么您可以期望它以特定的方式运行,但您实际上永远不会找到一个承诺,如果您的程序违反了规则,那么它将无法满足您的期望。

我亲眼目睹了一个软件更新经过数周的单元测试和集成测试,然后被送到现场,在那里运行了半年,然后一个“线程不安全”代码导致它在客户站点失败。

确保多线程程序正常工作的唯一方法是“证明”(A)它说出了你认为它说了什么,(B)它遵守了规则。

你的榜样遵守规则,但我不认为它做了你认为它做的事情。它有比赛条件。也就是说,两个线程都可以同时调用get("somekey"),并且都获得相同的值。然后,它们都可以计算出相同的新值,并且它们都可以将其返回。两次调用some_method(),但最终结果是该值只增加了一次。

相关问题