Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么非易失性方法有效?_Java_Multithreading_Volatile_Java Memory Model - Fatal编程技术网

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

Java 为什么非易失性方法有效?,java,multithreading,volatile,java-memory-model,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 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
但正如您所看到的,
a
b
并不是易变的。那么,为什么输出不是:

1 2
0 0
主线程缓存如何知道没有volatile语句的另一个线程缓存?
你能给我举个例子吗,在这个例子中我们得到了不同的值

如果您只有一个线程,那么无论如何都不会有问题。只要有n个线程和日志,尽可能多(或者最好写一些测试)。当它失败时,可能会出现一些情况

啊!!你的整数应该在另一个类中。比方说,大约有10个线程修改/读取同一个实例。你快到了吗


你会让他们变得不稳定,这是一个承诺

在一个线程中写入变量,然后在另一个线程中读取它(而不是将其进行易失性或同步等),这不是线程安全的

您可以获得“0”、“10”、“02”或“12”作为可能的输出。他们两个都不能保证。线程可以缓存
A
b
的值,这将导致输出“0”,但这只是一种可能的结果。这不需要发生


Volatile将保证输出“12”。

Volatile
是一种保证。缺少
volatile
就是缺少保证。使用volatile可以确保您的值不会被优化。@SotiriosDelimanolis:为什么不把它作为一个答案,这样它就可以被提升和接受?我似乎比我要写的答案要好;-)“我穿过街道,没有朝两边看,没有发生什么可怕的事情。为什么我没有被车撞到?”在
write
read
方法之间没有同步,因此他们可能也看不到
12