顺序一致性和原子性有什么区别?

2024-03-10

我读到 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(使用前将#替换为@)

顺序一致性和原子性有什么区别? 的相关文章

随机推荐