在Java中,C和C++是保證在單個給定線程內按順序逐行執行的源代碼,即使在編譯器優化後也是如此。好像沒有什麼是不可能獲得成功,如果系統被允許重新整理你的代碼,但我似乎無法找到任何文件,以保證如果我在Java中的以下內容:在單個線程內執行Java代碼是否保證順序?
class MyClass{
String testString = "";
public MyClass(){
}
public void foo(){
testString = "foo";
}
public void bar(){
testString = "bar";
testString += "r";
}
public String getTestString(){
return testString;
}
}
class Main{
static void main(String[] args){
MyClass testClass = new MyClass();
testClass.foo();
System.out.println(class.getTestString());
testClass.bar();
System.out.println(class.getTestString());
}
}
輸出將永遠是
"foo"
"barr"
和從未
"foo"
"rbar"
,或者如果內它們的方法調用和語句不是順序地執行作爲SPE可能出現的任何其它可能的變化在源代碼中引用。
這個問題引發了Java的具體問題,因爲它使得程序員對目標系統上的字節碼編譯器和JIT編譯器或解釋器將對您的代碼執行的操作的控制明顯減少。我所討論的主要系統是Android,爲此我實現了自己的信號量和互斥鎖定機制(例如,不會過多地使用像'synchronized'和'volatile'這樣的內置Java併發機制,它更適合於我的應用程序比Java提供的應用程序。然而,一位朋友警告我說,由於Java從源代碼到機器代碼的多重轉換水平,除非我使用Java的內置併發機制,否則不能保證我的信號量和鎖定實現將按我的意圖執行。這真的歸結爲是否存在一個特定的保證,對於任何給定的運行時實現,代碼的執行將在單個線程內連續執行。所以主要的問題是:
在C和C + +是代碼執行保證順序,儘管編譯器優化?如果沒有,是否足以實現這樣的保證來禁用編譯器優化?
在Java中,儘管潛在地改變了字節碼編譯器和JIT編譯器或解釋器(專門在Android上運行,但也適用於任意虛擬機實現),但是代碼執行是保證順序的?
如果上面的答案是肯定的,那麼是否有任何編程語言/平臺/上下文在單線程中的順序執行不能保證?
'在C和C++是執行代碼保證是,儘管編譯順序優化?'你在那裏開放了一整罐蠕蟲... – BoBTFish 2013-02-22 15:48:58
絕對不是。 [編譯器很少編譯你寫的代碼](http://channel9.msdn.com/Shows/Going+Deep/Cpp-and-Beyond-2012-Herb-Sutter-atomic-Weapons-1-of-2)。 – 2013-02-22 15:49:16
在單線程的過程中,您的方案將永遠不會發生...... – 2013-02-22 15:50:26