我读到 java 易失性是顺序一致的,但不是原子的。
对于原子性java提供了不同的库。
有人可以用简单的英语解释两者之间的区别吗?
(我相信问题范围包括 C/C++,因此添加这些语言标签以获得更多受众。)
想象一下一个类中的这两个变量:
int i = 0;
volatile int v = 0;
还有这两个方法
void write() {
i = 5;
v = 2;
}
void read() {
if (v == 2) { System.out.println(i); }
}
易失性语义保证read
将打印 5 或不打印任何内容(当然假设没有其他方法正在修改字段)。如果v
不挥发,read
不妨打印 0 因为i = 5
and v = 2
本来可以重新排序的。我想这就是您所说的顺序一致性的意思,它具有更广泛的含义。
另一方面,易失性并不能保证原子性。所以如果两个线程同时调用这个方法(v是相同的volatile int
):
void increment() {
v++;
}
你不能保证 v 会增加 2。这是因为v++
其实就是三个语句:
load v;
increment v;
store v;
并且由于线程交错, v 只能递增一次(两个线程将加载相同的值)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)