主方法起一个线程,线程先休眠一秒,然后设置线程中的一个变量,然后打印一些信息表示执行完毕。主方法这边轮询检查线程变量是否有值,一旦有值则跳出循环,打印一下信息表示执行完毕。
关键来了。
如果注释掉System.out.println("xuanxue");
,那么主方法永远也跑不完,去掉注释就 ok。目前没有头绪,求各位大佬指教。
代码如下
/***App.java***/
public class App {
public static void main(String[] args) throws Exception{
Test1 test1 = new Test1();
new Thread(test1).start();
int i = 0;
while (test1.getName() == null){
// 关键点
//System.out.println("xuanxue");
i++;
}
System.out.println(test1.getName() + " " + i);
}
}
/*** Test1.java***/
public class Test1 implements Runnable{
String name;
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
name = "test1";
System.out.println("set name over");
}
}
1
nws12304508 2017-11-02 20:24:58 +08:00
没有 cpu 时间去执行 test1 线程吧
|
2
EmdeBoas 2017-11-02 20:30:53 +08:00
可见性的问题,改成 volatile 就行了。至于 System.out.println 为什么会影响不清楚
|
3
darkblood 2017-11-02 20:31:54 +08:00 via Android
volatile String name
|
4
sagaxu 2017-11-02 20:54:29 +08:00 via Android
总算理解 php 是最好的语言这句话的深意了
|
5
lujjjh 2017-11-02 21:00:35 +08:00 2
|
6
forestyuan 2017-11-02 21:22:03 +08:00
估计是编译器的代码优化造成的
|
7
NeinChn 2017-11-02 21:28:43 +08:00
因为 System.out.println 这个里面包含 synchronized 代码段
碰巧解决了内存可见性而已 5 楼贴的回答也就是这个.... |
8
zhx1991 2017-11-02 22:26:34 +08:00
内存可见性以及 jvm 代码优化两个知识点
|
11
Moonnozhuce 2017-11-03 16:21:25 +08:00
很好的问题,刚才看到自己顺便复习了相关知识点:
1.vilatile 与 synchronized 可以达到相同的效果 2.sout 是因为代码里有了 |
12
Moonnozhuce 2017-11-03 16:22:36 +08:00
public void println(String x) {
synchronized (this) { print(x); newLine(); } } |