自动检测并行Java程序中的错误

当 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();
}
}

时间: 2024-08-30 16:35:48

自动检测并行Java程序中的错误的相关文章

Java 程序中的多线程

程序|多线程 在Java程序中使用多线程要比在 C 或 C++ 中容易得多,这是因为 Java 编程语言提供了语言级的支持.本文通过简单的编程示例来说明 Java 程序中的多线程是多么直观.读完本文以后,用户应该能够编写简单的多线程程序. 为什么会排队等待? 下面的这个简单的 Java 程序完成四项不相关的任务.这样的程序有单个控制线程,控制在这四个任务之间线性地移动.此外,因为所需的资源 - 打印机.磁盘.数据库和显示屏 -- 由于硬件和软件的限制都有内在的潜伏时间,所以每项任务都包含

在Java程序中运行外部类文件

程序 在Java程序中运行外部类文件 一.引言无论是用传统的编程语言(C++.VB等)还是Java语言编程,都经常需要在一个运行的程序中执行另外一个独立的外部程序.例如用Java设计一个IDE程序,那么这个IDE程序就必需能够调式.运行其它独立的外部Java程序.况且直接运行已经存在的外部程序来实现本程序的某些特定的功能,也是提高程序开发效率的一种重要手段.Java2为实现在一个Java程序中运行外部类文件(即Java程序)提供了的两种解决方案,即在同一进程中运行外部类文件和在不同进程中运行外部

java程序中双重检查锁定与延迟初始化

在java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化.此时程序员可能会采用延迟初始化.但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题.比如,下面是非线程安全的延迟初始化对象的示例代码: public class UnsafeLazyInitialization { private static Instance instance; public static Instance getInstance() { if (instanc

Java程序中的配置文件的存放和读取

大家可能经常会遇到在Java程序中存取程序配置文件的需求,比如,为了能够 和不同的数据库连接,我们经常把数据库连接的信息存放到属性文件中,这些信 息一般包括数据库驱动程序类名.数据库连接的URL,数据库的用户名和口令等等 .为了便于程序的安装或部署,我们经常会把这些的配置文件存放到程序安装的 根目录中.由于Java程序用包来分组类,有时候将这些配置文件放入到读取它们 的类所在的包目录中会更好一些.比如,在下面的图示中,将数据库配置文件 database.properties放到数据库读取类所在的

eclipse-Eclipse 运行java程序时出现错误

问题描述 Eclipse 运行java程序时出现错误 下面这张是我上一次运行的java程序 解决方案 main 函数要传递String args[] 如下: public static void main(String args[]) { } 解决方案二: 先编译 后运行 鼠标点击format.java的代码页面,就是现在这个页面 在这个页面下 ctr l+ s 编译当前文件 然后运行 解决方案三: 啥意思?这不是两个工程吗?要运行Format.java的话,选中这个文件,右键->Run as

介绍在Java程序中记录日志的最佳实践

本文介绍了在Java程序中记录日志的最佳实践,同时也介绍了如何使用开源软件对日志进行聚合和分析.对于现在的应用程序来说,日志的重要性是不言而喻的.很难想象没有任何日志记录功能的应用程序运行在生产环境中.日志所能提供的功能是多种多样的,包括记录程序运行时产生的错误信息.状态信息.调试信息和执行http://www.aliyun.com/zixun/aggregation/18195.html">时间信息等.在生产环境中,日志是 查找问题来源的重要依据.应用程序运行时的产生的各种信息,都应该通

教你怎样在java程序中引入neo4j数据库

随着关系型数据库在某些方面的力不从心,了解当下流行的各种数据库模式的特点和性能,无疑会给我们提供更多的选择和方向. neo4j是一种图形数据库,在遍历和关联查询方面具有突出的优势.废话少说,深入了解neo4j之前,先让我们尝试一下怎样在程序中使用neo4j. neo4j采用java语言开发,如果我们要在java程序中以内嵌方式使用neo4j,只需导入neo4j的对应包即可. 首先,我们来创建一个maven项目并修改pom.xml添加对neo4j的依赖. <?xml version="1.0

在Java程序中内嵌Mozilla浏览器

简介 SWT 浏览器部件是 SWT 所提供的众多部件中较为复杂的一个,它提供了在 Java 应用程序中内嵌浏览器应用并通过 Java API 与之进行交互的能力.一个 典型的应用场景是,开发者可以在客户段程序中嵌入一个内置浏览器,访问特定 HTML 应用,从而集 web 技术与客户端技术两者之所长,开发出具有更丰富功能 和界面的软件. 本文主要包含两个方面的内容:1. 如何在 Java 应用程序中内嵌基于 Mozilla 的浏览器部件.2. 使用 JavaXPCOM bridge 定制浏览器功能

java程序中如何加入声音?

问题描述 java程序中如何加入声音? 新手请具体点,想做一个汤姆猫那样,点击会有声音,如何加入声音?需要什么.jar包? 解决方案 java的声音处理方法: http://lz881228.blog.163.com/blog/static/1141973242010116112336643/ 解决方案二: JMF 搜一下看看 应该有不少教程 解决方案三: Applet 下 自己找下 应该很容易的 解决方案四: 这个,我以前没用过,肯定能加上...