我写了一个示例来尝试理解volatile。
public class VolatileExample {
private volatile boolean close = false;
public void shutdown() {
close = true;
}
public void work(){
Thread t1 = new Thread(new Runnable(){
public void run(){
while (!close) {
}
}
});
Thread t2 = new Thread(new Runnable(){
public void run(){
while (!close) {
shutdown();
}
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args){
VolatileExample volatileExample = new VolatileExample();
volatileExample.work();
}
}
我原本以为程序会停止,但实际上程序没有停止。我将volatile标记从关闭标签中删除后尝试了很多次,我期望程序不会停止,因为线程t1无法看到线程t2对关闭变量所做的更改,但是每次程序都顺利结束。所以我很困惑,既然我们可以在没有使用volatile的情况下完成它,那么volatile有什么用处呢?或者能否给出一个更好的例子来说明何时需要使用volatile和不需要使用volatile的区别?
谢谢!