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

krm*_*007 24 java multithreading jvm race-condition

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

如果你们中的任何人有一些见解,那么最好知道.

Mar*_*nik 17

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

获得真实情况的唯一方法是去学习Java语言规范的内存模型章节,但这是一个简化的视图:每当你有数据竞争时,几乎不能保证结果和阅读线程可能会看到任何已写入变量的值.其中还有唯一的保证:线程不会观察到"超薄空气"值,这种值从未写过.好吧,除非你正在处理longs或doubles,否则你可能会看到撕裂的写作.

  • 你在谈论死锁吗?没有锁定(例如,`synchronized`块),它们不可能出现. (2认同)

Seb*_*oek 5

也许我错过了什么,但有什么可以处理?还有一个线程会先到达那里.根据哪个线程,该线程将只更新/读取某个变量并继续执行下一条指令.它不能神奇地构建一个同步块,它并不真正知道你想做什么.换句话说,所发生的事情将取决于"种族"的结果.

注意我并没有深入到较低级别的东西,所以也许我不完全理解你的问题的深度.