我正在编写示例应用程序以了解易变的行为。
根据我的说法,此变量的值应更改为50
,但我得到的输出是10
。
主要方法:
public class Volatile {
public static void main(String[] args) {
ShareObj so = new ShareObj();
Thread1 t1 = new Thread1(so);
Thread2 t2 = new Thread2(so);
t1.start();
t2.start();
System.out.println(so.a);
}
}
类:
class ShareObj {
public volatile int a =10;
}
class Thread1 extends Thread {
ShareObj so;
Thread1(ShareObj so) {
this.so = so;
}
public void run() {
so.a += 10;
System.out.println(so.a);
}
}
class Thread2 extends Thread {
ShareObj so;
Thread2(ShareObj so) {
this.so=so;
}
public void run() {
so.a+=10;
System.out.println(so.a);
}
}
我期望的输出是
50
,但它是10
。有什么建议?
最佳答案
首先,您需要等待两个线程完成,然后再打印它们的结果。
...
t1.start();
t2.start();
t1.join(); // this will make main thread to wait untill thread is finished
t2.join();
.....
当前,您正在声明两个线程,但是在它们中的任何一个都可以更改易失性值之前,您的主线程正在准备值并退出。
文件是here。
关于java - 易失 key 未按预期工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31001655/