我今天读了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