讓我們下面的語句:獨立指令可以通過Java編譯器或JVM交換指令順序嗎?
int d0, d1;
int[] ds = {0, 0};
現在一個線程具有以下說明:
d0++;
d1++;
而另一個線程指令:
ds[1] = d1;
ds[0] = d0;
如果我們並行運行這些線程,顯然有三種組合可以看作:{0,0},{1,1}和{1,0}。
現在最大的問題是:還可以有{0,1}嗎?編譯器/ JVM可以簡單地交換指令,因爲它認爲它們不相關?如果是,那麼這些行爲的「規則」究竟是什麼,是由編譯器還是JVM決定?
通常優化被認爲是安全的,如果它們的行爲與串行(iow,一個線程)模型中未優化的代碼相同。除非相關的語言結構對線程有明確的規定 –