是否为线程更新了公共静态变量?(它是线程安全的吗?)

kuk*_*c67 1 java thread-safety

我尝试了以下内容,但没有奏效:

"开始"课程:

public class Start implements Runnable {

    Start start;
    LoadExample loadExample;
    Thread mainThread;
    Thread loadExampleThread;

    private boolean running = false;
    public static boolean isExampleLoaded = false;

    public static void main(String[] args) {
        begin = new Start();
        loadExample = new LoadExample();
        begin.start();
    }

    public synchronized void start() {
        mainThread = new Thread(this, "Main");
        mainThread.start();
        loadExampleThread = new Thread(loadExample, "Load Example");
        loadExampleThread.start();
    }

    public void run() {
        running = true;
        while (running) {
            if(isExampleLoaded){
                System.out.println("Loaded!");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

"LoadExample"类:

public class LoadExample implements Runnable {

    public void run(){
        //blabla, loading if you will...
        Start.isExampleLoaded = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可能会在上面的代码中发现语法错误,但这只是因为我在没有签入Eclipse的情况下键入了这个错误.我的原始代码非常相似,Eclipse没有显示任何错误或警告.

我的问题是代码不会打印"已加载!".我认为这是因为(1)线程无法更改静态变量或其他类的变量,或者(2)更改只是更新当前线程而不是其他(s),但我可能错了.

任何澄清表示赞赏.

编辑:

如果您发现上述任何错误,请告诉我,我会尽快更新.

das*_*ght 6

您需要标记变量volatile才能使此示例正常工作.没有volatile,读取线程将读取isExampleLoaded一次,而不是再次读取,因为编译器知道该变量尚未写入.

  • <这里有关于非最终公共静态的样板评论> (3认同)