一个 Java 多线程问题

2017-11-02 20:15:12 +08:00
 sun1992

主方法起一个线程,线程先休眠一秒,然后设置线程中的一个变量,然后打印一些信息表示执行完毕。主方法这边轮询检查线程变量是否有值,一旦有值则跳出循环,打印一下信息表示执行完毕。

关键来了。

如果注释掉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");
    }

}
2819 次点击
所在节点    程序员
12 条回复
nws12304508
2017-11-02 20:24:58 +08:00
没有 cpu 时间去执行 test1 线程吧
EmdeBoas
2017-11-02 20:30:53 +08:00
可见性的问题,改成 volatile 就行了。至于 System.out.println 为什么会影响不清楚
darkblood
2017-11-02 20:31:54 +08:00
volatile String name
sagaxu
2017-11-02 20:54:29 +08:00
总算理解 php 是最好的语言这句话的深意了
lujjjh
2017-11-02 21:00:35 +08:00
forestyuan
2017-11-02 21:22:03 +08:00
估计是编译器的代码优化造成的
NeinChn
2017-11-02 21:28:43 +08:00
因为 System.out.println 这个里面包含 synchronized 代码段
碰巧解决了内存可见性而已
5 楼贴的回答也就是这个....
zhx1991
2017-11-02 22:26:34 +08:00
内存可见性以及 jvm 代码优化两个知识点
zpxshl
2017-11-02 23:22:34 +08:00
@lujjjh 请问文章中的高频率出现的 pizzaArrived 是什么意思。。。。
zpxshl
2017-11-02 23:28:03 +08:00
@lujjjh 知道了。。。我傻了一直在研究 pizza 的另外的意思。。原来就是指批萨。。。
Moonnozhuce
2017-11-03 16:21:25 +08:00
很好的问题,刚才看到自己顺便复习了相关知识点:
1.vilatile 与 synchronized 可以达到相同的效果
2.sout 是因为代码里有了
Moonnozhuce
2017-11-03 16:22:36 +08:00
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/403042

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX