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
不是易变的,并且循环内没有任何东西可以否则会发生-之前).
在学习关键字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
不是易变的,并且循环内没有任何东西可以否则会发生-之前).