核心Java线程和易失性关键字用法

时间:2018-03-21 12:04:07

标签: java multithreading synchronization volatile

我最近开始研究核心Java中的多线程。我正在研究一个Volatile关键字。根据我的理解,允许线程在本地保存变量的值。如果变量驱动任何逻辑(例如循环),则线程将看不到对变量的更改,并且除非将变量声明为“volatile”,否则它们将继续使用过时的缓存值。

我创建了一个小代码来演示这个,但是,我的观察是不同的。即使共享变量“done”不是volatile,一个线程(主线程)所做的更改对另一个线程也是非常明显的。谁能帮助我理解这种行为

package com.test;

public class App implements Runnable {
    private boolean done= true;
    private static App a = new App();   


    public static void main( String[] args ) throws InterruptedException {
        Thread t = new Thread(a);
        t.start();
        System.out.println("Main Thread:"+ Thread.currentThread().getName());
        Thread.sleep(1);
        a.done=false;
        System.out.println("Value of done in main method is:"+ a.done);
    }

    public void run() {
        while(done) {
             System.out.println("Second Thread:"+ Thread.currentThread().getName());
            System.out.println("Still running");
        }
    }
}

以上代码的输出如下

Main Thread:main
Second Thread:Thread-0
Still running
Second Thread:Thread-0
Still running
Second Thread:Thread-0
Still running
Second Thread:Thread-0
Still running
Second Thread:Thread-0
Still running
Second Thread:Thread-0
Still running
Value of done in main method is:false

1 个答案:

答案 0 :(得分:3)

关键字volatile可保证您描述的行为。 volatile操作后,所有读者都可以看到write字段的值。这意味着不使用缓存值。

如果您没有使用volatile关键字,这并不意味着您始终使用旧的缓存变量。这可能是发生的可能性。

<强>外卖

您使用volatile关键字来保证内存可见性。这并不意味着不使用它会在您使用多线程时立即破坏您的代码。

另请注意,volatile不保证与变量的原子交互。这意味着volatile字段在竞争条件和其他潜在问题上不会自动保证线程安全。