鑑於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。 –