鉴于x86
总存储顺序和Java存储器模型中发生的事前关系,我们知道编译器不保证指令执行的顺序。它可以根据需要重新排序,以提高性能。鉴于此,我们有:Java内存模型和并发
EAX
,EBX
是寄存器[x]
,[y]
是内存位置r1
和r2
是局部变量的名称x
,y
共享变量访问的名字所有线程。所有变量都是32位整数。- 不,这是不是一个家庭问题。
所以我有两套的问题,我想,以确定可能的输出:
[x] == [y] == 0 // the address space of [x] and [y] are 0.
// Thread 1 Thread 2
MOV [x] <- 1 MOV [y] <- 1
MOV EAX <- [y] MOV EBX <- [x]
这对寄存器EBX
和EAX
的可能值?
int x = 0;
int y = 0;
// Thread 1 Thread 2
x = 1; y = 1;
r1 = y; r2 = x;
什么r1
和r2
的可能值?
IMO,您应该将x86架构与Java分离。这是一个关于JVM被允许做什么的问题,或者这是一个关于x86处理器实际上可以做什么的问题。至于JVM被允许做什么,线程1可以将0或1分配给'r1',而线程2可以将0或1分配给r2。 –