如何测试多线程和并发的 Java

主要观点:测试多线程并发 Java 代码困难,因每次测试运行仅捕获一种可能的线程交错且交错是非确定性的,为此创建了开源工具 VMLens 以确定性和可重现方式测试并发 Java 代码。
关键信息

  • 给出一个简单的并发Address类示例,包括获取和更新地址的方法。
  • 测试中出现数据竞争错误,因读和写操作间无同步,添加volatile修饰符后仍有问题,如出现部分更新的地址。
  • 引入ReentrantLock解决部分更新问题,测试成功。
  • 还缺少对从两个线程并行更新类的测试,现有的技术如java.util.concurrent虽能利用多核,但缺少测试正确性的方法。
    重要细节
  • 测试代码通过AllInterleavings循环遍历所有可能的执行顺序来覆盖线程交错。
  • 数据竞争在两个线程同时访问同一字段且无适当同步时发生,会导致线程看到非最新值,Java Memory Model中对同步动作和数据竞争有正式定义。
  • updategetStreetAndCity方法中使用ReentrantLock实现同步,确保线程安全。
  • 随着 CPU 核心数增加,需要更好的测试方法来验证多线程代码的正确性,VMLens 有望填补此空白。
阅读 184
0 条评论