我已经编写了下面的代码,并想测试它的并发性。即使我使用了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);
}
1条答案
按热度按时间wbrvyc0a1#
有谁能建议如何测试这一点吗?
线程安全测试是不可靠的。原因是,编程语言或库的规范可能承诺,如果您的多线程程序遵守特定的规则,那么您可以期望它以特定的方式运行,但您实际上永远不会找到一个承诺,如果您的程序违反了规则,那么它将无法满足您的期望。
我亲眼目睹了一个软件更新经过数周的单元测试和集成测试,然后被送到现场,在那里运行了半年,然后一个“线程不安全”代码导致它在客户站点失败。
确保多线程程序正常工作的唯一方法是“证明”(A)它说出了你认为它说了什么,(B)它遵守了规则。
你的榜样遵守规则,但我不认为它做了你认为它做的事情。它有比赛条件。也就是说,两个线程都可以同时调用
get("somekey")
,并且都获得相同的值。然后,它们都可以计算出相同的新值,并且它们都可以将其返回。两次调用some_method()
,但最终结果是该值只增加了一次。