如何使用JUnit测试线程安全性的方法

时间:2019-01-28 14:42:48

标签: java multithreading junit concurrency

我实现了一个类,该类充当对象的缓存。它具有一个DelayQueue用于从缓存中删除对象。

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中实现具有多个线程的两个单元测试?

0 个答案:

没有答案