解决方案 »

  1.   

    volatile修饰的变量一旦被修改会立刻刷入主存,因此其他线程可见。
    这里如果去掉volatile,MonitorThread可能在t.setName("测试");之前(或者尽管执行了setName但是还未刷到主存)读取testArray放到自身线程的工作栈中,所以看到的是过期的值。可以把MonitorThread的run方法改为如下形式:
    public void run() {
    try {
                Thread.sleep(5000);
            } catch (Exception e) {
            }
            while (true) {
              
            }
        }
    这时InitThread线程可以在MonitorThread读取之前执行t.setName("测试");(并有更大的希望刷新到主存)因此MonitorThread可以读取到最新的值而能顺利结束。
    本人菜鸟,希望大神指正