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
。