Java 我很困惑,易变真的有用吗?
我写了一个例子试图理解volatileJava 我很困惑,易变真的有用吗?,java,volatile,Java,Volatile,我写了一个例子试图理解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 (!
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从close标记中移除时,我已经尝试了很多次——我希望程序不会停止,因为线程t1看不到线程t2对close变量所做的更改,但是程序每次都成功结束。所以我很困惑,现在我们可以不用volatile来完成它,挥发性物质的用途是什么?或者你能给出一个更好的例子来区分使用volatile和不使用volatile吗
谢谢大家! 内存模型只说非易失性字段的更改在其他线程中可能不可见
也许您的运行时环境处于合作状态 对非易失性字段的更改有时对其他线程可见,有时则不可见。它们对其他线程可见所需的时间可以根据机器正在执行的其他处理、机器上处理器芯片和内核的数量、机器上高速缓存的体系结构等数量级而变化
不过,归根结底,这归结为:有缺陷的并发代码可以在前999999次成功,但在第一百万次失败。这通常意味着它通过了所有的测试,然后在生产中失败了。因此,在编写并发代码时,尽最大努力确保代码正确是很重要的,这意味着对从多个线程访问的变量使用volatile,即使它在测试中似乎没有什么不同。Java不能保证事情会出问题。这是调试并发性问题的难点之一。+1,但更准确地说,JMM只说对volatile字段的更改将在其他线程中可见;它没有提到任何关于非易失性字段的内容(即使是这个吹毛求疵的地方,它也在掩盖一些东西)。