快速业务通道

自动检测并行Java程序中的错误 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
ample.Value : get : 18 sample.Value : add : 15 sample.Task : run : 32 Data Race 2 : 4 : sample/Value : x Thread Thread-3 id: 7 : READ sample.Value : get : 15 sample.Value : add : 15 sample.Task : run : 32 Thread Thread-4 id: 8 : WRITE sample.Value : get : 15 sample.Value : add : 15 sample.Task : run : 32

在图形界面Eclipse中运行,得到以下结果:

Figure 1.

自动检测并行Java程序中的错误 - 编程入门网

MTRAT 报告出了两个数据竞争错误,因为类Task的两个实例会访问类Value的 对象,然而这个共享的对象却没有被一个共同的锁保护。

例如,在并行程序执行过程中,可能存在这样的时刻,一个线程执行方法get 读域x的值,而另外一个线程执行执行方法add写域x。

根据检查结果,MTRAT 发现了两个数据竞争错误,在类sample/Value域x。程 序员在得到这两个数据竞争错误后,很容易就能发现程序中存在两个线程并发访 问同一个对象域的可能。如果两个线程可以顺序访问这个对象域,这两个数据竞 争问题就可以被消除了。

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

时间:2011-06-19 IBM / 齐 尧 甘 志 罗 志达 戴 晓君

检测死锁

死锁问题也是并行 Java 程序中常见的问题。在 Java 程序中出现死锁,是 因为 synchronized 关键字会造成运行的线程等待关联到某个一个对象上的锁。 由于线程可能已经获得了别的锁,两个线程就有可能等待对方释放掉锁。在这种 情况下,两个线程将永远等待下去。

在下边的 Java 程序就隐藏了一个潜在死锁问题,

class T3 extends Thread { StringBuffer L1; StringBuffer L2; public T3(StringBuffer L1, StringBuffer L2) { this.L1 = L1; this.L2 = L2; } public void run() { synchronized (L1) { synchronized (L2) { } } } } public class Deadlock { void harness2() throws InterruptedException { StringBuffer L1 = new StringBuffer("L1"); StringBuffer L2 = new StringBuffer("L2"); Thread t1 = new T3(L1, L2); Thread t2 = new T3(L2, L1); t1.start(); t2.start(); t1.join(); t2.join(); } public static void main(String[] args) throws InterruptedException { Deadlock dlt = new Deadlock(); dlt.harness2(); } }

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

时间:2011-06-19 IBM / 齐 尧 甘 志 罗 志达 戴 晓君

在类 Deadlock 的 harness2 方法中,类 Deadlock 的两个实例被创建,作 为参数传递到类 T3 的构造函数中。在类 T3 的 run 方法中,线程会依次获得 这个两个对象的锁,然后以相反的顺序释放这两个锁。由于两个 StringBuffer 实例以不同的顺序传递给类 T3,两个线程会以不同的顺序获得这两个锁。这样 ,死锁就出现了。

以 MTRAT 运行类 sample.Deadlock,可以在运行时刻检查程序中的潜在的死 锁错误:

$ mtrat -Dcom.ibm.mtrat.deadlock=true -cp . sample.Deadlock Thread 7 : Acquire L1 L2 Dead Lock 1 Thread 7, acquired lock1 -> try lock2 sample/T3 line 109 Thread 8, acquired lock2 -> try lock1 sample/T3 line 109 Thread 8 : Acquire L2 L1

在图形界面Eclipse中运行,得到以下结果:

图 2.

自动检测并行Java程序中的错误 - 编程入门网

在 MTRAT 的死锁检查报告中我们可以发现,线程 Thread 7 已经获得了锁 lock1,在程序 109 行试图获得锁 lock2。然而,线程 Thread 8 已经获得了锁 lock2,在程序 109 行试图获得锁lock1。

根据 MTRAT 的死锁检查报告,程序员可以很容易得知道,这个死锁问题是由 于两个线程按照相反的顺序上锁造成的。避免这种问题的一种方法是让代码按固 定的全局顺序获取锁。那么如果两个线程按照一致的顺序去上锁,死锁错误就可 以

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号