Java class 实现 Runnable,创建新线程,然后 returns 奇怪的结果。为什么?
Java class implements Runnable, creates new thread, then returns strange results. Why?
我正在了解 Java 及其怪癖。这是怎么回事?
public class myThread implements Runnable {
String msg = "yes";
public void run() {
this.msg = "No";
}
public static void main(String[] args) {
myThread one = new myThread();
(new Thread(one)).start();
for (int i = 0; i < 10; i++) {
System.out.println(one.msg);
}
}
}
结果:是
不
不
不
不
不
不
不
不
否
为什么第一个结果 return 为 'yes',然后将其设置为 'No'?
因为 start()
开始新线程和修改 msg
花费的时间稍长,所以在线程开始之前完成了一个循环迭代。第一次迭代后,msg
已被线程修改并显示 No
。
您的新线程在后台运行,而主线程继续运行。
两者之间没有同步,所以后台线程会在完全未指定的某一点将值从"yes"更改为"no"。与此同时,主线程只是打印它此时看到的内容。
如果我正确理解 Java 内存模型,在没有任何 synchronized
、volatile
或其他同步构造的情况下,甚至不能保证主线程看到其他线程的更改完全。
您已经创建了一个新的 Thread
并调用了 start()
方法来开始执行。但是 JVM 决定线程何时会 运行。每次你 运行 程序你都会得到不同的结果。
首先你得到 yes
然后 No
。主线程首先打印 yes
然后 JVM 启动子线程更改 msg
的值,然后控制权返回主线程并将 msg
打印为 No
直到结束循环。
我正在了解 Java 及其怪癖。这是怎么回事?
public class myThread implements Runnable {
String msg = "yes";
public void run() {
this.msg = "No";
}
public static void main(String[] args) {
myThread one = new myThread();
(new Thread(one)).start();
for (int i = 0; i < 10; i++) {
System.out.println(one.msg);
}
}
}
结果:是 不 不 不 不 不 不 不 不 否
为什么第一个结果 return 为 'yes',然后将其设置为 'No'?
因为 start()
开始新线程和修改 msg
花费的时间稍长,所以在线程开始之前完成了一个循环迭代。第一次迭代后,msg
已被线程修改并显示 No
。
您的新线程在后台运行,而主线程继续运行。
两者之间没有同步,所以后台线程会在完全未指定的某一点将值从"yes"更改为"no"。与此同时,主线程只是打印它此时看到的内容。
如果我正确理解 Java 内存模型,在没有任何 synchronized
、volatile
或其他同步构造的情况下,甚至不能保证主线程看到其他线程的更改完全。
您已经创建了一个新的 Thread
并调用了 start()
方法来开始执行。但是 JVM 决定线程何时会 运行。每次你 运行 程序你都会得到不同的结果。
首先你得到 yes
然后 No
。主线程首先打印 yes
然后 JVM 启动子线程更改 msg
的值,然后控制权返回主线程并将 msg
打印为 No
直到结束循环。