Welcome 微信登录

首页 / 软件开发 / JAVA / 自动检测并行Java程序中的错误

自动检测并行Java程序中的错误2011-06-19 IBM / 齐 尧 甘 志 罗 志达 戴 晓君当 CPU 进入多核时代之后,并行编程将更加流行,但是编写并行程序更容易出错。在开发过程中,工程师能注意到同一个程序在单线程运行时是正确的,但是在多线程时,它会有可能出错。和并行相关的错误的产生原因通常都非常隐晦,而且在一次测试中,它们的出现与否具有很强的随机性。由于程序中多个线程之间可能以任意的方式交错执行,即使一个并行程序正确的运行了成百上千次,下一次运行仍然可能出现新的错误。

Multi-Thread Run-time Analysis Tool 是由 IBM 为多线程 Java 程序开发的运行时分析工具,它可用于分析并查找 Java 代码中的一些不容易发现的潜在并行程序错误,比如数据竞争 (Data Race) 和死锁 (Deadlock),从而提高并行程序的代码质量。本文将介绍检测 Java 程序中随机并行错误的一种新工具 (http://alphaworks.ibm.com/tech/mtrat),检查 Java 代码中的潜在的并行程序错误,从而提高代码的安全性和稳定性,并演示其对于潜在而并未发生的错误的发掘能力。

概述

Java 编程语言为编写多线程应用程序提供强大的语言支持。但是,编写有用的、没有错误的多线程程序仍然比较困难。编程语言中线程面临很多挑战。在这些挑战中,最主要的就是编程复杂度的提高。这些编程复杂度是由同步共享变量的访问,潜在的依赖于时序的错误和调试和优化并行程序的复杂性造成的。

MTRAT 只所以把不同的技术集成到了一个单一的开发工具中,是为了掩盖工具内部的复杂性,并使得 MTRAT 方便使用。 MTRAT 主要由以下部分组成,

简单的命令行界面和 Eclipse 插件。输出 MTRAT 检查到的并行错误。

动态的 Java 字节码修改引擎。可以在 Java 类文件被 Java 虚拟机加载的时候,修改 Java 类。

程序运行时信息收集器。收集程序的动态信息,比如内存访问,线程同步,创建和结束。

高效的运行时分析引擎。收集到的运行时信息会被在线分析,如果发现潜在的并行错误,将会通过界面报告给用户。

检测数据竞争

在并行程序中,当两个并行的线程,在没有任何约束的情况下,访问一个共享变量或者共享对象的一个域,而且至少要有一个操作是写操作,就会发生数据竞争错误。MTRAT 最强大的功能就是发现并行程序中潜在的数据竞争错误。在下边的 Java 程序就隐藏了一个潜在的数据竞争错误。

package sample;
class Value
{
private int x;

public Value()
{
x = 0;
}

public synchronized void add (Value v)
{
x = x + v.get();
}

public int get() {return x;}
}
class Task extends Thread
{
Value v1, v2;

public Task (Value v1, Value v2)
{
this.v1 = v1;
this.v2 = v2;
}

public void run() {v1.add(v2);}
}
public class DataRace
{
public static void main (String[] args) throws InterruptedException
{
Value v1 = new Value ();
Value v2 = new Value ();
Thread t1 = new Task(v1, v2);
Thread t2 = new Task (v2, v1);
t1.start();
t2.start();
t1.join();
t2.join();
}
}