静态变量在线程之间共享吗?

14 浏览
0 Comments

静态变量在线程之间共享吗?

我在一门高级Java多线程课程中的老师说了一些我不确定的东西。

他说以下代码不一定会更新ready变量。根据他的说法,这两个线程不一定共享静态变量,特别是在每个线程(主线程与ReaderThread)在自己的处理器上运行,并且不共享相同的寄存器/缓存等,并且一个CPU不会更新另一个CPU。

基本上,他说ready在主线程中可能会更新,但在ReaderThread中不会更新,所以ReaderThread将无限循环。

他还声称程序可能会打印042。我知道如何打印42,但不知道如何打印0。他提到当number变量设置为默认值时会出现这种情况。

我想也许不能保证静态变量在线程之间更新,但对于Java来说,这对我来说非常奇怪。将ready设置为volatile是否可以解决这个问题?

他展示了以下代码:

public class NoVisibility {  
    private static boolean ready;  
    private static int number;  
    private static class ReaderThread extends Thread {   
        public void run() {  
            while (!ready)   Thread.yield();  
            System.out.println(number);  
        }  
    }  
    public static void main(String[] args) {  
        new ReaderThread().start();  
        number = 42;  
        ready = true;  
    }  
}

0