java多线程中,线程的工作内存何时被共享内存刷新?
public class Main {
private static int a = 0;
public static void main(String[] args) throws Exception {
new Thread(() -> {
while (a == 0) ;
System.out.println("线程结束!");
}).start();
Thread.sleep(1000);
System.out.println("正在修改a的值...");
a = 1; //很明显,按照我们的逻辑来说,a的值被修改那么另一个线程将不再循环
}
}
上面这个运行后子线程永远不会结束。
但是我这么写:
public class Main {
private static int a = 0;
public static void main(String[] args) throws Exception {
new Thread(() -> {
while (a == 0){
int[] i=new int[200];//填上后,程序可以结束
} ;
System.out.println("线程结束!");
}).start();
Thread.sleep(1000);
System.out.println("正在修改a的值...");
a = 1; //很明显,按照我们的逻辑来说,a的值被修改那么另一个线程将不再循环
}
}
发现程序是可以结束的。
但是我缩小int数组的范围,就不能结束了:
public class Main {
private static int a = 0;
public static void main(String[] args) throws Exception {
new Thread(() -> {
while (a == 0){
int[] i=new int[1];//缩小后,程序不会正常结束。
} ;
System.out.println("线程结束!");
}).start();
Thread.sleep(1000);
System.out.println("正在修改a的值...");
a = 1; //很明显,按照我们的逻辑来说,a的值被修改那么另一个线程将不再循环
}
}
这是为什么呢?
而且我还试了一下别的。
如在循环体里写:sleep、new String("111")、new File()、pringtln()等都可以让程序结束。
但是写如:int a=1、new 自己写的一个空类()等就不能结束。
我想问的是为什么有些操作可以刷新子线程的工作内存?