我正在编写示例应用程序以了解易变的行为。
根据我的说法,此变量​​的值应更改为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/

10-11 06:31