【发布时间】:2015-01-27 08:29:37
【问题描述】:
如果多个线程尝试更新同一个成员变量,则称为竞争条件。但是我更感兴趣的是如果我们不在代码中通过使其同步或其他方式来处理它,那么 JVM 是如何在内部处理它的?它会挂起我的程序吗? JVM 将如何应对它?我认为 JVM 会为这种情况临时创建一个同步块,但我不确定到底会发生什么。
如果你们中的任何人有一些见解,很高兴知道。
【问题讨论】:
-
这是一个很棒的问题,因为 Java 是少数具有真正线程支持的 VM 的“解释型”语言之一。 Java 线程真正使用本机线程执行,其中 Python 等语言支持伪线程(我在看你,GIL)。
-
我找到了一些讨论here,等着看SO有什么深入的说法
-
它没有。无论哪个线程先运行(这取决于很多参数,包括外部参数)都会赢得比赛。结果通常是不可预测的。 JVM 本身甚至不知道存在数据竞争。
-
看一下没有竞争条件的 clojure 事务内存模块。
-
JVM 无论如何都不会处理竞争条件。如果您的代码中有竞争条件,那么您的程序就有错误,您必须自己修复它。 JVM 不会自动为您解决这个问题。
标签: java multithreading jvm race-condition