在这个程序中,如果将while循环中的println注释掉,main线程对tag的赋值没有作用,还是死循环。如果在while中执行println,则main线程对tag的赋值能起作用,myThread会停止。请问这是什么原因

解决方案 »

  1.   

    这个是可见性的问题,当主线程对另一个线程对象的成员变量进行赋值的时候,该线程并不能立马就能获取到该变量的值的变化,
    private volatile boolean tag=true;(加上volatile就好了)
    按道理来说,加不加prinln应该都是一样的情况,但是我试了好几下也是一样,
      

  2.   

    在赋值过程的时候加一个断点,跟进去看看tag的值改变了么
    或者在setTag的时候,输出下赋值结果看看
      

  3.   

    之前看的一篇博客说的,像这种不加volatile,大多数也是可以让线程停止的,因为在mian线程中更改的tag的值,会被刷新到主存中,myThread线程每次执行的时候会从主存中去加载tag的值。但有极少数情况下(比如高并发下再加上机器性能等各方面问题),myThread没有时间,所以不会去主存中重新加载tag的值。所以我在想,是不是因为我加了println,本次调用和下次调用的时间相隔会稍微久一点,myThread才有时间去重新加载tag的值,所以才可以停掉线程,不加println就停不掉。我们俩测试有区别我怀疑有可能是电脑性能的原因。不知道对不对。我刚开始看多线程,有点懵,很多靠推测的