我有两个线程:
线程1:
a = 1;
x = b;
线程:2
b = 1
y = a
这里声明了a和b为volatile。我不理解在a = 1;和y = a;以及x = b;和b = 1;之间如何创建"happens-before"边缘。
我知道使用volatile变量可以防止从线程缓存读取旧值。但是,volatile变量如何确保happens-before顺序。
具体来说,我不理解这句话:
对volatile字段的写入发生在每个随后对相同字段的读取之前。
它是如何工作的?
我有两个线程:
线程1:
a = 1;
x = b;
线程:2
b = 1
y = a
这里声明了a和b为volatile。我不理解在a = 1;和y = a;以及x = b;和b = 1;之间如何创建"happens-before"边缘。
我知道使用volatile变量可以防止从线程缓存读取旧值。但是,volatile变量如何确保happens-before顺序。
具体来说,我不理解这句话:
对volatile字段的写入发生在每个随后对相同字段的读取之前。
它是如何工作的?
为了进行分析,首先列出所有可能的同步顺序,这些顺序必须与编程顺序一致。在你的例子中,有6个可能的顺序。
1 2 3 4 5 6
w(a) w(a) w(b) w(a) w(b) w(b)
r(b) w(b) w(a) w(b) w(a) r(a)
w(b) r(b) r(b) r(a) r(a) w(a)
r(a) r(a) r(a) r(b) r(b) r(b)