[讨论] 如何获取多线程程序语句执行次序及结果

minixalpha 2014-08-18

在 Java Concurrency in Practice 这本书中,第16章讲了 Java 内存模型,其中第16.1.2节举了个和重排序有关的例子:

 

public class PossibleReordering {
	static int x = 0, y = 0;
	static int a = 0, b = 0;
	
	public static void main(String[] args) throws InterruptedException {
		
		Thread one = new Thread(new Runnable() {
			public void run() {
                a = 1;
                x = b;
			}
		});
		
		Thread other = new Thread(new Runnable() {
			
			public void run() {
                b = 1;
                y = a;
			}
		});
		
		one.start();
		other.start();
		one.join();
		other.join();
	}
}

 

书里说,如果执行次序为:

 

x=b -> b=1 -> y=a -> a=1 

 

那么 x, y 最后值为 (0, 0)

 

我的问题是:

 

假如只考虑读操作和写操作,操作数都是 int 类型,那么,

 

1. 是否有虚拟机的实现,提供这样一种机制,可以让我们记录下多线程程序语句的执行次序,以便分析最终的执行结果是如何导致的。

 

2. 在记录每条语句时,是否可以同时记录下,写操作写入了什么值,向哪个变量写入;读操作读入什么值,哪个变量读入了值。

 

我现在知道通过 JVMTI 的 SingleStep 接口,可以在要执行下一条字节码时,调用 agent 中自己写的 SingleStep 函数,可以记录下这条字节码,但这又引发了新的问题:

 

1. 通过这种方式记录下的执行次序,与Java内存模型中说的重排序是一回事吗?

2. 这种方式还是无法记录下当前的操作数是什么。

 

 

rink1969 2014-08-21
c语言相关的有一些仿真器,或者检查工具可以。java还不大清楚。
你可以看看 xue jingling 教授关于data race方面的工作

他来过我之前的公司做过这方面的讲座,但是当时讲座的资料好像没公开
随便找了一篇他的学生的文章  http://unsworks.unsw.edu.au/fapi/datastream/unsworks:10795/SOURCE01

但是效果不怎么好,这个领域非常困难,无论采用何种技术,总会有false positives 和 false negatives

另外软件工具多多少少会对程序执行有影响。完全仿真类的也不行,总会有些奇奇怪怪的硬件特性模拟不好,而且还慢。最好是上ICE之类的硬件。
Global site tag (gtag.js) - Google Analytics