在 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. 这种方式还是无法记录下当前的操作数是什么。