java - 您如何使用 JUnit 测试线程安全的方法
问题描述
我有一个实现了一个作为对象缓存的类。它有一个用于从缓存中删除对象的延迟队列。
class mySingletonClass {
ConcurrentHashMap map<String,MyObject>();
DelayQueue queue <MyObject>();
boolean alreadySeen(MyObject myObject) {
MyObject obj = map.putIfAbsent(myObject.getID(),myObject);
if(obj != null) return true;
queue.add(myObject);
return false;
}
它适用于单线程。我正在尝试同时使用多个线程对其进行测试。我试图推断这种方法是否是线程安全的,但我不确定。我试过静态分析器 FindBugs 插件。我不确定如何对此进行单元测试。我从来没有使用过 java.util.concurrent 也没有使用过线程,所以我试图相对快速地学习它。
我对单元测试的想法是创建一个 AtomicInteger 并运行多个线程来尝试将相同的对象添加到地图中。如果该方法返回 true,则增加整数。如果成功,该整数应等于 1。作为我的第二个测试,我想与 AtomicInteger 类似地尝试可能有 10 个?线程,每个线程添加 5 个唯一对象的列表,并确保所有线程完成后的总数为 5。
我一直在玩 Executors 并创建 Runnable 方法,但我得到了 NullPointerExceptions,我不确定我在做什么。
我在找:
这种方法线程安全吗?如果没有,有没有办法让它线程安全(除了让方法同步)?
如何在junit4中使用多个线程实现两个单元测试?
解决方案
推荐阅读
- c - 弄清楚我想做的基本工作。但是需要加PWM
- r - 将数据框拆分为 5 部分并将多余的行放在最后
- android - Android不知道能不能满足我的需求,想用adb root来实现,用户简介
- javascript - 将带有 args 的函数传递给 typescript 中的 props
- tinymce - 如何将 TinyMCE 默认格式选项设置为项目符号格式
- spring-boot - Junits 未使用最新的 Spring Boot 版本运行
- tensorflow - Google Colab 内存不足
- c - C 信号没有按照它们发送的相同顺序被捕获(或根本没有被捕获)
- json - 使用 shell 脚本从 json 数组中提取最大值
- python - 在 webdiver 会话之后,Selenium 节点不会杀死进程