测试并发应用(六)用 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版本。

怎么做呢…

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


01 import java.util.concurrent.TimeUnit;
02 import java.util.concurrent.locks.ReentrantLock;
03 
04// 1. 创建一个类,名为 Task,扩展 Runnable 接口.
05 public class Task implements Runnable {
06     // 2. 声明一个 ReentrantLock 属性,名为 Lock.private
07 
08     ReentrantLock lock;// 3. 实现类的构造函数。public
09 
10     Task(ReentrantLock lock) {
11         this.lock = lock;
12     }
13 
14     // 4. 实现run() 方法。获取lock的控制,让线程休眠2秒再释放lock。
15     @Override
16     public void run() {
17         lock.lock();
18         try {
19             TimeUnit.SECONDS.sleep(1);
20             lock.unlock();
21         } catch (InterruptedException e) {
22             e.printStackTrace();
23         }
24     }
25 
26     // 5.创建例子的主类通过创建一个类,名为 Main 并添加 main()方法。
27     public static class Main {
28 
29         public static void main(String[] args) {
30             // 6. 声明并创建一个 ReentrantLock 对象,名为 lock.
31             ReentrantLock lock = new ReentrantLock();
32             // 7. 创建10个 Task 对象和10个线程来执行这些任务。调用 run() 方法开始线程。
33             for (int i = 0; i < 10; i++) {
34                 Task task = new Task(lock);
35                 Thread thread = new Thread(task);
36                 thread.run();
37             }
38         }
39          
40     }
41}

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来调试并发代码 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值