java - JVM 如何在内部处理竞争条件?

标签 java multithreading jvm race-condition

如果多个线程尝试更新同一个成员变量,则称为竞争条件。但是我更感兴趣的是如果我们不在代码中通过使其同步或其他方式来处理它,那么 JVM 是如何在内部处理它的?它会挂起我的程序吗? JVM 将如何应对它?我认为 JVM 会为这种情况临时创建一个同步块(synchronized block),但我不确定到底会发生什么。

如果你们中的任何人有一些见解,很高兴知道。

最佳答案

准确的术语是数据竞争,它是竞争条件的一般概念的特化。 数据竞赛这个术语是一个官方的、精确指定的概念,这意味着它来自对代码的正式分析。

了解真实情况的唯一方法是去研究 Java 语言规范的内存模型章节,但这是一个简化的 View :每当您遇到数据竞争时,几乎无法保证结果和读取线程可能会看到已写入变量的任何值。这也是唯一的保证:线程将不会观察到从未写入过的“凭空出现”的值。好吧,除非你正在处理 longs 或 doubles,否则你可能会看到撕裂的写入。

关于java - JVM 如何在内部处理竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27192739/

相关文章:

java - 在 Spring 3.1 Java Config 中引用 Spring Security 配置

java - (Geotools 库)如何转换韩国坐标(EPSG :5179) to Decimal Degree coordinates (EPSG:4326)

multithreading - 在 Parallel.Foreach 循环(线程)中创建组件时保持组合根

java - 如何同步不同的java程序访问公共(public)资源

java - 如何检测未触摸/点击 View ?

java - 与 32 位 tomcat 相比,使用 64 位 tomcat 是否可以提高性能?

java - androidx.cardview.widget.CardView 无法转换为 androidx.recyclerview.widget.RecyclerView

java - 一个小程序让Windows 7彻底死机

java - 如何在第三方类中为 java.util.Random 提供特定种子?

java - 向下转换对象的时间复杂度是多少?