我最近开始研究核心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
答案 0 :(得分:3)
关键字volatile
可保证您描述的行为。 volatile
操作后,所有读者都可以看到write
字段的值。这意味着不使用缓存值。
如果您没有使用volatile
关键字,这并不意味着您始终使用旧的缓存变量。这可能是发生的可能性。
<强>外卖强>:
您使用volatile
关键字来保证内存可见性。这并不意味着不使用它会在您使用多线程时立即破坏您的代码。
另请注意,volatile
不保证与变量的原子交互。这意味着volatile
字段在竞争条件和其他潜在问题上不会自动保证线程安全。