JVM 如何在内部处理争用条件?

2022-09-01 21:05:41

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

如果你们中的任何一个人有一些见解,那就太好了。


答案 1

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

获得真实情况的唯一方法是去研究Java语言规范的内存模型章节,但这是一个简化的观点:每当你有数据竞争时,几乎不能保证结果,并且读取线程可能会看到任何曾经写入变量的值。其中还有唯一的保证:线程不会观察到“凭空”的值,而该值从未被写入。好吧,除非您正在处理s或s,否则您可能会看到撕裂的写入。longdouble


答案 2

也许我错过了一些东西,但有什么要处理的?仍然有一个线程将首先到达那里。根据哪个线程,该线程将只更新/读取一些变量并继续执行下一个指令。它不能神奇地构造一个同步块,它真的不知道你想做什么。换句话说,发生的事情将取决于“竞赛”的结果。

注意,我不太喜欢低级的东西,所以也许我不完全理解你问题的深度。