测试并发应用(六)用 FindBugs 分析并发代码

声明:本文是《 Java 7 Concurrency Cookbook 》的第八章, 作者: Javier Fernández González 译者:郑玉婷

用 FindBugs 分析并发代码

静态代码分析工具是一套通过分析应用源代码来查找潜在异常的工具。这些工具,例如 Checkstyle, PMD, 或者 FindBugs,他们有定义极好的实践(good practices) 规则,然后解析源代码来查找有没有违反这些规则。目的是在产品运行之前,更早的找到异常或者修改较差性能的代码。各种编程语言通常提供这样的工具,Java也不例外。分析Java代码的工具之一是 FindBugs。 它是开发资源工具,包含了一系列的规则来分析 Java concurrent 代码。

在这个指南,你将学习如何使用工具来分析你的 Java concurrent 应用。

准备

在开始这个指南之前,你应该从项目网页(http://findbugs.sourceforge.net/)下载 FindBugs。你可以下载一个standalone应用或者Eclipse 插件。在这个指南中,使用的是standalone版本。

怎么做呢…

按照这些步骤来实现下面的例子:

[code language=”java”]

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

// 1. 创建一个类,名为 Task,扩展 Runnable 接口.
public class Task implements Runnable {
// 2. 声明一个 ReentrantLock 属性,名为 Lock.private

ReentrantLock lock;// 3. 实现类的构造函数。public

Task(ReentrantLock lock) {
this.lock = lock;
}

// 4. 实现run() 方法。获取lock的控制,让线程休眠2秒再释放lock。
@Override
public void run() {
lock.lock();
try {
TimeUnit.SECONDS.sleep(1);
lock.unlock();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

// 5.创建例子的主类通过创建一个类,名为 Main 并添加 main()方法。
public static class Main {

public static void main(String[] args) {
// 6. 声明并创建一个 ReentrantLock 对象,名为 lock.
ReentrantLock lock = new ReentrantLock();
// 7. 创建10个 Task 对象和10个线程来执行这些任务。调用 run() 方法开始线程。
for (int i = 0; i < 10; i++) {
Task task = new Task(lock);
Thread thread = new Thread(task);
thread.run();
}
}

}
}

[/code]

8. 把项目导出为 jar 文件。命名为 recipe8.jar。使用你的IDE的菜单选项,或者使用javac 和 jar 命令来编译并压缩你的应用。
9. Start the 开始使用 FindBugs standalone 应用 在Windows 运行 findbugs.bat 命令或者在 Linux 使用 findbugs.sh 命令。
10. 菜单栏的 File 菜单的New Project 选项来创建新的项目。

11. FindBugs 应用展示了项目的配置窗口。在Project Name 区域显示文字 Recipe08。在 Classpath 的分析区域加入了项目的jar文件并在 Source 路径区域加入了例子的源代码的路径。详见以下裁图:

12. 单击 Analyze 按钮来创建新的项目并分析它的代码。
13. The FindBugs 应用显示了代码的分析结果。在这个例子中,它找到了2个bugs。
14. 单击其中一个bug,你可以在右手边的版面看到 bug 的源代码和在屏幕的下端的版面有bug的描述。

它是如何工作的…

以下的截图是FindBugs的分析结果:

在这个应用中,分析检查到了下面2个潜在的bugs:

一个是在 Task 类的run()方法中。如果 If an InterruptedExeption 异常被抛出,由于任务不会执行unlock()方法就不会释放锁。这样就可能在应用中形成deadlock的状况。
另一个是在Main类的 main() 方法中,因为你直接调用线程的 run() 方法,但是还没有调用 start() 方法来开始执行线程。

如果你双击任何一个bugs,就可以看到它的具体信息。只要你在配置这个项目中引用了source-code,你就可以看到bug被检查到的源代码。以下截图向你展示了一个例子:

更多…

要注意的是FindBugs 只能检查一些问题情况(无论是否与并发代码相关)。例如,如果你删除 Task 类中的 run()方法中的 unlock()调用,然后重新分析,FindBugs 是不会警告你在task里还有个lock你还没有解放。

使用静态代码分析工具可以帮助你提升你的代码,但是不要期望它可以找到你代码中的所有bugs。

参见

第八章,测试并发应用: 配置NetBeans来调试并发代码

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 测试并发应用(六)用 FindBugs 分析并发代码

  • Trackback 关闭
  • 评论 (2)
    • 辛多雷
    • 2014/01/01 9:34上午

    thread.run();
    这里开始线程了吗??start()才是启动线程吧。如果是为了执行下run方法为什么还要new 一个Thread呢?

      • 辛多雷
      • 2014/01/01 9:36上午

      好吧!我懂了!~

return top