看看这段代码。
主题:
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语句的另一个线程缓存? 你能告诉我一个例子,那个案例给了我们不同的价值观吗?
答案 0 :(得分:3)
在一个线程中编写一个变量,并在另一个线程中读取它(没有它是易失性的,或者是同步的等)不是线程安全的。
您可以输出“0 0”,“1 0”,“0 2”或“1 2”作为输出。他们俩都没有保证。线程可以缓存a
和b
的值,这将导致输出“0 0”,但这只是一种可能的结果。它不需要发生。
易失性将提供输出“1 2”的保证。
答案 1 :(得分:0)
如果你只有一个线程,那么无论如何都不会有问题。只要拥有n个线程和日志,无论你能做什么(或者更好地编写一些测试)。当它失败时,可能会有一些情况。
啊!你的整数应该在另一个班级。可以说,大约10个线程修改/读取同一个实例。几乎就在那里:D
那么你会让em变得不稳定,这是一个承诺!