首页 > 编程知识 正文

java编辑器有哪些(java中序遍历)

时间:2023-05-03 13:54:00 阅读:71328 作者:1450

我今天读了java面试问题。 我读了这个问题:

问题:请考虑以下Java代码片段: 初始化了两个变量,两个线程T1和T2都更改了这些值,而不是易失性的。 如下所示,两者都不同步

int x=0;

布尔退出=假;

thread1(不同步) )。

x=1;

b退出=true;

不同步(thread2) )。

if(bexit==true ) ) ) )。

system.out.println(x='x );

线程2能否打印“x=0”?

因此,答案是肯定的.在解释中"因为没有同步和易失性等编译器的任何命令,所以bExit=true在编译器的排序中有可能出现在x=1之前. "在此之前,编译器在之后的其他行中的命令

为什么要排序? 如果要从另一个线程向控制台打印任何内容-要先打印的行,如果要从同一线程打印,是否要在要打印的行之后打印? 这对我来说很奇怪(也许,我第一次看到这个东西就重新排序) .有人能给我解释一下吗?

解决方法:

如果JIT编译器*不根据Java标准更改结果,则可以更改执行顺序.交换

x=1;

b退出=true;

b退出=true;

x=1;

结果不会改变。 要说为什么,那是因为没有同步。 也就是说,默认情况下,在执行此操作时,这些变量不能被另一个线程读取。 此外,这些语句不需要其他变量。 ((现代CPU实际上同时运行两个命令。 这当然是未指定的,意味着首先会更改。 ) ) ) ) ) )。

更改顺序后,不仅会发生该动作,还可能会在一个内存页面上运行bExit,在另一个内存页面上运行x。 在多处理器(或多核)系统上运行APP应用程序时,如果不同步,可能会出现带bExit的内存页面。 (在带x的内存页面之前,其他所有核心都会显示变更。

*编辑: Java编译器(.Java编译为. class )不能更改线程中的执行顺序,但可以将JIT编译器).class编译为二进制代码)。 但是,如果您确定有剩余的Java编译器,则可以省略它们。

x=1;

b退出=true;

x=2;

能够使远x=1最佳化;

标签: java,多线索

资料来源: https://codeday.me/bug/2019 06 12/122339.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。