gpt4 book ai didi

java - 如何为并发类编写正确性测试?(2个 Action 不是并行执行的)

转载 作者:行者123 更新时间:2023-11-28 20:51:11 27 4
gpt4 key购买 nike

我的任务是编写我的自定义执行器服务。

它应该几乎像往常一样工作,但是 2 个具有相同键(任务字段)的任务不应并行执行。我已经编写了代码,我确信它应该可以正常工作。

但是我需要写测试。我还没有遇到过这样的 with 测试。

我无法通过谷歌搜索到有关此的有用信息。

请分享您的经验。

附言

我有以下接口(interface)的执行器:

  class TaskExecutor {
void submit(Task task){
...
}
}


class Task implements Runnable{
String key;
public void run(){...}
...
}

在某处

taskExecutor.execute(new MyTask() {                              

@Override
public String getKey() {
return "key1"
}

@Override
public void run() {...}
);

最佳答案

我会首先测试线程是否按顺序运行,一切是否正确。因此,使用单线程执行器服务构建测试并检查它是否正确处理线程。如果有的话,您还可以在这里测试算法中的极端情况。

然后测试线程并行运行时会发生什么。如果没有工具支持,我认为这是不可能的。我在这里看到两个可以帮助您的工具:

  1. jcstress这是作为 OpenJDK 的一部分开发的开源工具。它允许您多次运行测试,以确保捕获仅在特定线程交错时发生的错误。您可能无法使用此工具测试完整的执行程序服务。但是您应该能够测试您用来确保不会多次安排任务的算法。
  2. vmlens免责声明:我开发了这个工具。 vmlens 是一个商业工具,但您当然可以下载试用版。它跟踪您的应用程序并可以检测执行跟踪中的竞争条件。

作为最后一点,我想给你一个竞争条件的例子,如果没有这些工具之一你就无法检测到它:

@Override
public String toString() {
String sc = stringCache;
if (sc == null)
stringCache = sc = layoutChars(true);
return sc;
}
/**
* Used to store the canonical string representation, if computed.
*/
private transient String stringCache;

如您所见,此方法不是线程安全的。实例变量stringCache 读写不可变,不同步。如果您在 AMD 兼容处理器上使用 jcstress 运行它,您将看到以下 NullPointer 异常:

java.lang.NullPointerException
at java.lang.String.equals(String.java:982)

您可能不会在 Intel 处理器上看到这样的错误,因为 Intel 处理器不会重新排序语句。顺便说一句,这是 java.math.BigDecimal 中的 toString 方法。

关于java - 如何为并发类编写正确性测试?(2个 Action 不是并行执行的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45922698/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com