自动检测并行Java程序中的错误 - 编程入门网
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. MTRAT 报告出了两个数据竞争错误,因为类Task的两个实例会访问类Value的 对象,然而这个共享的对象却没有被一个共同的锁保护。 例如,在并行程序执行过程中,可能存在这样的时刻,一个线程执行方法get 读域x的值,而另外一个线程执行执行方法add写域x。 根据检查结果,MTRAT 发现了两个数据竞争错误,在类sample/Value域x。程 序员在得到这两个数据竞争错误后,很容易就能发现程序中存在两个线程并发访 问同一个对象域的可能。如果两个线程可以顺序访问这个对象域,这两个数据竞 争问题就可以被消除了。 自动检测并行Java程序中的错误(3)时间:2011-06-19 IBM / 齐 尧 甘 志 罗 志达 戴 晓君检测死锁 死锁问题也是并行 Java 程序中常见的问题。在 Java 程序中出现死锁,是 因为 synchronized 关键字会造成运行的线程等待关联到某个一个对象上的锁。 由于线程可能已经获得了别的锁,两个线程就有可能等待对方释放掉锁。在这种 情况下,两个线程将永远等待下去。 在下边的 Java 程序就隐藏了一个潜在死锁问题,
自动检测并行Java程序中的错误(4)时间:2011-06-19 IBM / 齐 尧 甘 志 罗 志达 戴 晓君在类 Deadlock 的 harness2 方法中,类 Deadlock 的两个实例被创建,作 为参数传递到类 T3 的构造函数中。在类 T3 的 run 方法中,线程会依次获得 这个两个对象的锁,然后以相反的顺序释放这两个锁。由于两个 StringBuffer 实例以不同的顺序传递给类 T3,两个线程会以不同的顺序获得这两个锁。这样 ,死锁就出现了。 以 MTRAT 运行类 sample.Deadlock,可以在运行时刻检查程序中的潜在的死 锁错误:
在图形界面Eclipse中运行,得到以下结果: 图 2. 在 MTRAT 的死锁检查报告中我们可以发现,线程 Thread 7 已经获得了锁 lock1,在程序 109 行试图获得锁 lock2。然而,线程 Thread 8 已经获得了锁 lock2,在程序 109 行试图获得锁lock1。 根据 MTRAT 的死锁检查报告,程序员可以很容易得知道,这个死锁问题是由 于两个线程按照相反的顺序上锁造成的。避免这种问题的一种方法是让代码按固 定的全局顺序获取锁。那么如果两个线程按照一致的顺序去上锁,死锁错误就可 以 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |