【问题标题】:How do we test synchronization code?我们如何测试同步代码?
【发布时间】:2016-12-21 23:02:55
【问题描述】:

最近,我正在编写一段涉及同步的代码,并在努力研究如何对其进行测试。为了解决这个问题,我们可以考虑为 CountDownLatch 编写单元测试:

CountDownLatch l = new CountDownLatch(1);

new Thread() {
    @Override
    void run() {
        l.await();
        System.out.println("good!");
    }
}.start();

Thread.sleep(1000); // wait for thread to run
if (the thread is alive)
    l.countDown();
else
    System.out.println("bad!");

所以问题是,不能保证sleep 1 秒在所有机器的所有情况下都足够了。所以我的目标是消除这种在测试同步时期望某种状态的睡眠代码,但很快就会意识到它开始变成停止问题。

我目前的解决方案是查询线程的状态:

Thread t = ...
t.start();

if (t.getState() == Thread.State.WAITING) {
    l.countDown();
    assert(t.getState() == Thread.State.RUNNABLE); // or running or terminated
}

我的问题是:

  1. 这行得通吗?即此时线程的状态是否会自动地切换,在这种情况下,倒计时锁存器会达到唤醒条件吗?(文档没有说明状态的更改时间)李>
  2. 您有更好的建议吗?

【问题讨论】:

  • 不测试线程状态,测试行为。我不知道你的代码试图做什么,所以我不能告诉你如何测试它。
  • @ИгорьДобровольський 不,我更多的是测试同步机制。
  • 通过考虑可能的情况并为它们编写测试。 FWIW,我通常通过将Runnables / Callables 放在单独的单线程ExecutorServices 上来测试这类事情,然后让我的单元测试等待它们完成(使用shutdown() 和@987654330 @),如果他们没有在几百毫秒内完成,则超时。 Java 8 ListenableFutures 可能有更好的方法。
  • 这种单元测试的目的是什么?当有同步的代码块并且第二个线程会等到第一个线程完成时,您不信任 Java?还是什么?

标签: java multithreading


【解决方案1】:

查看您的示例,我感觉您正在使用倒计时闩锁。为什么你不能这样做:

    @Test
    public void testThreads() throws Exception {
        CountDownLatch l = new CountDownLatch(1);

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Parallel thread is doing something.");
                try {
                    // instead of this sleep you put your logic that you want to be executed.
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                l.countDown();
            }
        }).start();

        System.out.println("Main thread is waiting for parallel thread");
        l.await();

        System.out.println("Done.");
    }

如果我误解了您的问题,请纠正我。

但总的来说,我同意您帖子下方的其中一位 cmets,即您可能不应该使用单元测试来测试多线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 2011-01-04
    相关资源
    最近更新 更多