V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sun1992
V2EX  ›  程序员

一个 Java 多线程问题

  •  
  •   sun1992 · 2017-11-02 20:15:12 +08:00 · 2626 次点击
    这是一个创建于 2360 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    关键来了。

    如果注释掉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");
        }
    
    }
    
    12 条回复    2017-11-03 16:22:36 +08:00
    nws12304508
        1
    nws12304508  
       2017-11-02 20:24:58 +08:00
    没有 cpu 时间去执行 test1 线程吧
    EmdeBoas
        2
    EmdeBoas  
       2017-11-02 20:30:53 +08:00
    可见性的问题,改成 volatile 就行了。至于 System.out.println 为什么会影响不清楚
    darkblood
        3
    darkblood  
       2017-11-02 20:31:54 +08:00 via Android
    volatile String name
    sagaxu
        4
    sagaxu  
       2017-11-02 20:54:29 +08:00 via Android
    总算理解 php 是最好的语言这句话的深意了
    forestyuan
        6
    forestyuan  
       2017-11-02 21:22:03 +08:00
    估计是编译器的代码优化造成的
    NeinChn
        7
    NeinChn  
       2017-11-02 21:28:43 +08:00
    因为 System.out.println 这个里面包含 synchronized 代码段
    碰巧解决了内存可见性而已
    5 楼贴的回答也就是这个....
    zhx1991
        8
    zhx1991  
       2017-11-02 22:26:34 +08:00
    内存可见性以及 jvm 代码优化两个知识点
    zpxshl
        9
    zpxshl  
       2017-11-02 23:22:34 +08:00 via Android
    @lujjjh 请问文章中的高频率出现的 pizzaArrived 是什么意思。。。。
    zpxshl
        10
    zpxshl  
       2017-11-02 23:28:03 +08:00 via Android
    @lujjjh 知道了。。。我傻了一直在研究 pizza 的另外的意思。。原来就是指批萨。。。
    Moonnozhuce
        11
    Moonnozhuce  
       2017-11-03 16:21:25 +08:00
    很好的问题,刚才看到自己顺便复习了相关知识点:
    1.vilatile 与 synchronized 可以达到相同的效果
    2.sout 是因为代码里有了
    Moonnozhuce
        12
    Moonnozhuce  
       2017-11-03 16:22:36 +08:00
    public void println(String x) {
    synchronized (this) {
    print(x);
    newLine();
    }
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   946 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:51 · PVG 03:51 · LAX 12:51 · JFK 15:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.