静态变量在线程之间共享吗?
静态变量在线程之间共享吗?
我在一门高级Java多线程课程中的老师说了一些我不确定的东西。
他说以下代码不一定会更新ready
变量。根据他的说法,这两个线程不一定共享静态变量,特别是在每个线程(主线程与ReaderThread
)在自己的处理器上运行,并且不共享相同的寄存器/缓存等,并且一个CPU不会更新另一个CPU。
基本上,他说ready
在主线程中可能会更新,但在ReaderThread
中不会更新,所以ReaderThread
将无限循环。
他还声称程序可能会打印0
或42
。我知道如何打印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; } }