
主方法起一个线程,线程先休眠一秒,然后设置线程中的一个变量,然后打印一些信息表示执行完毕。主方法这边轮询检查线程变量是否有值,一旦有值则跳出循环,打印一下信息表示执行完毕。
关键来了。
如果注释掉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 |
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(); } } |