在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