代码之家  ›  专栏  ›  技术社区  ›  Don Branson marios

使用TDD输出线程安全代码

  •  10
  • Don Branson marios  · 技术社区  · 16 年前

    利用TDD来驱动线程安全代码的好方法是什么?例如,假设我有一个工厂方法,它利用惰性初始化只创建一个类的实例,然后返回它:

    private TextLineEncoder textLineEncoder;
    ...
    public ProtocolEncoder getEncoder() throws Exception {
        if(textLineEncoder == null)
            textLineEncoder = new TextLineEncoder();
        return textLineEncoder;
    }
    

    我用Java问这个问题,但答案应该更广泛地适用。

    6 回复  |  直到 16 年前
        1
  •  5
  •   James A Wilson    16 年前

    您可以注入一个“提供者”(一个非常简单的工厂),负责这一行:

     textLineEncoder = new TextLineEncoder();
    

    然后您的测试将注入一个非常缓慢的提供者实现。这样,测试中的两个线程就更容易发生冲突。您可以让第一个线程等待第二个线程释放的信号量。然后,测试的成功将确保等待线程超时。通过给第一个线程一个开头,您可以确保它在第二个线程释放之前等待。

        2
  •  3
  •   Morendil    16 年前

    这很难,虽然可能——可能比它的价值更难。已知的解决方案涉及测试代码。讨论 here, "Extreme Programming Challenge Fourteen" 值得仔细检查。

        3
  •  2
  •   Esko Luontola    16 年前

    Clean Code

    my project ,在我的四核机器上运行测试大约需要2秒钟。当我想要测试并发部分时(有一些测试),我在IntelliJ IDEA中按住运行所有测试的热键,直到我在状态栏中看到20、50或100个测试运行正在执行。我在Windows任务管理器中跟踪CPU和内存使用情况,以了解所有测试运行何时完成执行(当所有测试运行时,内存使用增加1-2GB,然后缓慢下降)。

    还有一些框架,如 http://www.alphaworks.ibm.com/tech/contest 它使用字节码操作来强制代码进行更多的线程切换,从而增加了并发错误可见的可能性。

        4
  •  2
  •   Community CDub    7 年前

    this question . 希望这会有所帮助,即使那里没有测试。希望链接比复制答案更好。。。

        5
  •  1
  •   Yuval F    16 年前

    第12章 Java Concurrency in Practice 被称为“测试并发程序”。它记录了安全性和活性的测试,但表示这是一个困难的课题。我不确定用那一章的工具能解决这个问题。

        6
  •  0
  •   Sean Chambers    16 年前

    你能比较一下返回的实例,看看它们是相同的实例还是不同的实例吗?这可能就是我从C#开始的地方,我想在java中也可以这样做