在 Java、C 和 C++ 中,即使在编译器优化之后,源代码是否保证在单个给定线程中逐行顺序执行?如果允许系统重新排序您的代码,似乎什么都不会起作用,但我似乎找不到任何文档来保证如果我在 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"
或者如果其中的方法调用和语句未按照源代码中指定的顺序执行,则可能出现的任何其他可能变化。
这个问题特别与 Java 有关,因为它使程序员对目标系统上的字节码编译器和 JIT 编译器或解释器将对您的代码做什么的控制权明显减少。对我来说主要的系统是 Android,我为它实现了我自己的信号量和互斥锁机制(例如,没有过多使用内置的 Java 并发机制,如“同步”和“易失”关键字),这更适合我的应用程序比 Java 提供的应用程序。然而,一位朋友警告我,由于 Java 从源代码到机器代码经历了多层次的转换,除非我使用 Java 的内置并发机制,否则无法保证我的信号量和锁定实现会按我的预期执行。这实际上归结为是否有一个特定的保证,对于任何给定的运行时实现,代码的执行将在单个线程中顺序执行。所以主要的问题是:
在 C 和 C++ 中,尽管编译器优化,代码执行是否保证是连续的?如果不是,禁用编译器优化是否足以实现这样的保证?
尽管字节码编译器和 JIT 编译器或解释器(特别是在 Android 上运行但也适用于任意 VM 实现)可能会进行更改,但在 Java 中是否保证代码执行是连续的?
如果上述答案如我所料是肯定的,是否有任何编程语言/平台/上下文不能保证在单个线程中顺序执行?