为什么非易失性方法有效?

时间:2014-08-02 17:49:11

标签: java multithreading volatile java-memory-model

看看这段代码。

主题:

public class MyThread extends Thread {

    int a = 0;
    int b = 0;

    public void run() {
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        read();
    }

    public void write(int a, int b) {
        this.a = a;
        this.b = b;
    }

    public void read() {
        System.out.println(a + " " + b);
    }


}

主要课程:

public class Main {

    public static void main(String[] args) throws InterruptedException {

        MyThread t = new MyThread();
        t.start();
        t.write(1, 2);
        System.out.println(t.getA() + " " + t.getB());

    }
}

输出是:

1 2
1 2

但正如您所看到的,ab并不易变。那么为什么输出不是:

1 2
0 0

主线程缓存如何知道没有volatile语句的另一个线程缓存? 你能告诉我一个例子,那个案例给了我们不同的价值观吗?

2 个答案:

答案 0 :(得分:3)

在一个线程中编写一个变量,并在另一个线程中读取它(没有它是易失性的,或者是同步的等)不是线程安全的。

您可以输出“0 0”,“1 0”,“0 2”或“1 2”作为输出。他们俩都没有保证。线程可以缓存ab的值,这将导致输出“0 0”,但这只是一种可能的结果。它不需要发生。

易失性将提供输出“1 2”的保证。

答案 1 :(得分:0)

如果你只有一个线程,那么无论如何都不会有问题。只要拥有n个线程和日志,无论你能做什么(或者更好地编写一些测试)。当它失败时,可能会有一些情况。

啊!你的整数应该在另一个班级。可以说,大约10个线程修改/读取同一个实例。几乎就在那里:D

那么你会让em变得不稳定,这是一个承诺!