Java非空循环会影响线程读取静态变量吗?

Java non-empty loop will effect thread reading static variables?

在学习关键字volatile时,我找到了。 我做了一些更改,但结果令人困惑。这是我的代码:

import java.util.concurrent.*;

public class VolatileTest {

    // public static volatile int finished = 0; // 1
    public static int finished = 0; // 2

    public static void main(String[] args) throws ExecutionException {
        ExecutorService executor = Executors.newFixedThreadPool(2);

        Future<?> future = executor.submit(()->{
            while (finished == 0) {
                // when comment the below if-block, result confused
                if(Thread.currentThread().isInterrupted()){
                    System.out.println("???");
                    break;
                }
            }
        });

        executor.submit(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ignored) {
                ;
            } finally {
                finished = 1;
            }
        });

        System.out.println("Started..");

        try{
            future.get(5, TimeUnit.SECONDS);
            System.out.println("finished");
        } catch (TimeoutException | InterruptedException e){
            System.out.println("timeout!");
        } finally {
            future.cancel(true);
        }

        executor.shutdown();
    }
}

这段代码运行正常,并输出

Started..
finished

但是当我在第一次提交中评论 if-block 时,输出是

Started..
timeout!

但是进程还在运行ning,好像没有循环return。

所以我的问题是: 非空循环会影响线程读取静态变量吗?

如果while循环中没有任何内容:

while (finished == 0) {}

允许 JVM 有效地执行此操作:

if (finished == 0) while (true) {}

因为它没有迹象表明 finished 可能会以需要读取的方式进行更改(因为 finished 不是易变的,并且循环内没有任何东西可以否则会发生-之前).