如果多个线程尝试更新同一个成员变量,则称为竞争条件。但是我更感兴趣的是如果我们不在代码中通过使其同步或其他方式来处理它,那么 JVM 是如何在内部处理它的?它会挂起我的程序吗? JVM 将如何应对它?我认为 JVM 会为这种情况临时创建一个同步块(synchronized block),但我不确定到底会发生什么。
如果你们中的任何人有一些见解,很高兴知道。
最佳答案
准确的术语是数据竞争,它是竞争条件的一般概念的特化。 数据竞赛这个术语是一个官方的、精确指定的概念,这意味着它来自对代码的正式分析。
了解真实情况的唯一方法是去研究 Java 语言规范的内存模型章节,但这是一个简化的 View :每当您遇到数据竞争时,几乎无法保证结果和读取线程可能会看到已写入变量的任何值。这也是唯一的保证:线程将不会观察到从未写入过的“凭空出现”的值。好吧,除非你正在处理 long
s 或 double
s,否则你可能会看到撕裂的写入。
关于java - JVM 如何在内部处理竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27192739/