public class TestThread {
private static boolean flag = false;
public static void main(String[] args) {
new Thread() {
int i = 0;
public void run() {
long tm = System.currentTimeMillis();
while (!flag) {
i++;
}
System.out.println(System.currentTimeMillis() - tm);
}
}.start();
new Thread() {
public void run() {
try {
Thread.sleep(2000);
flag = true;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
}
首先是这样,这样线程永远不会退出,因为线程读到的是旧值,如果给flag加上volatile则会退出。但加了一句打印的语句就奇怪了:
public class TestThread {
private static boolean flag = false;
public static void main(String[] args) {
new Thread() {
int i = 0;
public void run() {
long tm = System.currentTimeMillis();
while (!flag) {
i++;
System.out.println(i);
}
System.out.println(System.currentTimeMillis() - tm);
}
}.start();
new Thread() {
public void run() {
try {
Thread.sleep(2000);
flag = true;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
}
如果这样子,即使不加上volatile,线程也会退出,求解。。我的JDK版本是1.6.0_37。