理解发生前一致性
Java 语言规范 (JLS) 第 17 章中介绍了发生前一致性的概念。简单地说,如果 A 中没有读操作看到其后发生的写操作,或者 A 中存在另一个与读操作冲突的写操作,则一组操作 A 是发生前一致的。
理解定义
发生在一致性之前的定义可以解释如下:(a)读取操作不可能看到在其之后发生的写入操作,或者(b) 在同一线程中存在另一个写入操作,该写入操作与读取操作写入同一变量,并且写入操作发生在读取操作之前。
发生在一致性的示例如下所示您提供的第二个执行顺序:
r2 = A; // sees write of A = 2 r1 = B; // sees write of B = 1 B = 1; A = 2;
在这种情况下,r2 看到之前执行的对 A 的写入,r1 看到对 B 的写入。因此,此执行顺序是发生之前一致的。
对实际应用程序的影响
在多线程环境中,发生前一致性可确保线程以正确的顺序看到其他线程执行的写入。然而,在某些情况下,读取会看到稍后发生的写入,这称为重新排序。这种情况可能是由于内存优化或硬件缓存而发生的,它们可以临时将数据存储在私有寄存器中。
重新排序的一个示例是当线程已写入变量但新值对其他线程不可见时,因为它仍然存储在私人寄存器中。如果受影响的变量在线程之间共享,这可能会导致意外的行为和竞争条件。
为了防止重新排序,可以使用易失性字段。易失性字段确保读取和写入以一致的顺序执行,并且所有线程看到相同的值。这是通过强制读写访问共享内存而不是私有寄存器来实现的。
以上是Happens-Before 一致性如何确保多线程环境中的顺序?的详细内容。更多信息请关注PHP中文网其他相关文章!