首页 > 解决方案 > 您如何使用 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,我不确定我在做什么。

我在找:

  1. 这种方法线程安全吗?如果没有,有没有办法让它线程安全(除了让方法同步)?

  2. 如何在junit4中使用多个线程实现两个单元测试?

标签: javamultithreadingjunitconcurrency

解决方案


推荐阅读