gpt4 book ai didi

Java 内存模型和成功的 boolean 值

转载 作者:行者123 更新时间:2023-11-30 05:58:38 25 4
gpt4 key购买 nike

我是 Java 线程的新手,最近才开始阅读内存模型。根据我的理解,Java 内存模型允许编译器进行优化。

这可能会使多线程代码和同步变得复杂,但我的问题是要简单得多。就拿这个例子来说,由于这两个语句彼此不依赖,编译器是否有可能改变 try 语句中代码的顺序,从而破坏检查?

boolean success = false;
try{
MyClass.someFunction();
success = true;
}
catch(Exception e){

}

if(success){
System.out.println("Sucess!");
}
else{
System.out.println("Fail!");
}

最佳答案

没有。 Java 编译器需要执行您所期望的操作 - 如果 Myclass.someFunction() 正常返回,则打印 Success!,如果返回则打印 Fail!它引发了一个异常。这通常来自 Java 的语义,并且独立于编译器可能进行的任何编译器优化(除非它可能限制合法的优化)。

原因是 Java 语言规范规定,在单个线程内,程序的行为必须与语句完全按照从上到下的顺序执行一样。编译器可以自由地以各种不直观的方式重写您的程序以生成字节码,但它必须保留这样的错觉:在单个线程中,它正在以正确的顺序运行您在源代码中键入的语句。

Java 语言规范可以将其扩展到多线程上下文,并规定每个线程必须始终看到与所有线程执行的源代码一致的世界状态。但是,(a) 这将使编写正确的编译器优化变得非常困难,并且许多其他有用的优化将是非法的; (b) 它不会对程序员有太大帮助,因为无论如何它都不会消除对正确同步的需要;它主要只是将损坏的程序变成不太明显的损坏程序。

相反,Java 内存模型定义了一个线程中的内存修改何时对其他线程可见的精确规则,并让编译器执行其想要的操作。这是一个很好的折衷方案,因为它为程序员提供了一组规则,他们可以使用它们来确保他们的多线程程序正确,同时仍然为编译器编写者提供了实现良好优化的余地。

但是你的问题的重点是:编译器可以在幕后做任何它想做的事情,但不允许改变程序的含义。在单线程上下文中,程序的含义被明确定义,并且不会允许编译器做您认为它可以做的坏事。

关于Java 内存模型和成功的 boolean 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4121189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com