做网站界面需要注意什么问题/赣州网站建设
考虑第二个问题.
你意味着我会翻译成X86 Fetch-And-Add指令,这是不正确的.如果代码由JVM进行编译和优化,则可能是真的(必须检查JVM的源代码来确认),但是该代码也可以在解释模式下运行,其中fetch和add被分离并且不同步.
出于好奇,我检查了为这个Java代码生成的汇编代码:
public class Main {
volatile int a;
static public final void main (String[] args) throws Exception {
new Main ().run ();
}
private void run () {
for (int i = 0; i < 1000000; i++) {
increase ();
}
}
private void increase () {
a++;
}
}
我使用Java HotSpot(TM)Server VM(17.0-b12-fastdebug)for windows-x86 JRE(1.6.0_20-ea-fastdebug-b02),建立于2010年4月1日03:25:33版本的JVM(这一个我在我的驱动器的某个地方).
这些是运行它的关键输出(java -server -XX:PrintAssembly -cp.Main):
起初它被编成这个:
00c PUSHL EBP
SUB ESP,8 # Create frame
013 MOV EBX,[ECX + #8] # int ! Field VolatileMain.a
016 MEMBAR-acquire ! (empty encoding)
016 MEMBAR-release ! (empty encoding)
016 INC EBX
017 MOV [ECX + #8],EBX ! Field VolatileMain.a
01a MEMBAR-volatile (unnecessary so empty encoding)
01a LOCK ADDL [ESP + #0], 0 ! membar_volatile
01f ADD ESP,8 # Destroy frame
POPL EBP
TEST PollPage,EAX ! Poll Safepoint
029 RET
然后它被内联和编译成这样:
0a8 B11: # B11 B12 <- B10 B11 Loop: B11-B11 inner stride: not constant post of N161 Freq: 0.999997
0a8 MOV EBX,[ESI] # int ! Field VolatileMain.a
0aa MEMBAR-acquire ! (empty encoding)
0aa MEMBAR-release ! (empty encoding)
0aa INC EDI
0ab INC EBX
0ac MOV [ESI],EBX ! Field VolatileMain.a
0ae MEMBAR-volatile (unnecessary so empty encoding)
0ae LOCK ADDL [ESP + #0], 0 ! membar_volatile
0b3 CMP EDI,#1000000
0b9 Jl,s B11 # Loop end P=0.500000 C=126282.000000
你可以看到它不使用Fetch-And-Add指令.