JVM прекрасно справится с ситуацией (то есть не будет висеть или жаловаться), но вы не можете получить результат, который вам нравится!
Когда задействовано несколько потоков, java становится ужасно сложным, и даже код, который выглядит явно правильным, может оказаться ужасно сломанным. В качестве примера:
public class IntCounter {
private int i;
public IntCounter(int i){
this.i = i;
}
public void incrementInt(){
i++;
}
public int getInt(){
return i;
}
}
имеет недостатки во многих отношениях.
Во-первых, предположим, что i в настоящее время 0 и нить A и нить B оба вызова incrementInt()
примерно в то же время. Существует опасность того, что они оба увидят, что i равно 0, затем оба увеличивают его 1, а затем сохраняют результат. Поэтому в конце двух вызовов я только 1, а не 2!
Это проблема состояния гонки с кодом, но есть и другие проблемы, касающиеся видимости памяти.Когда поток A изменяет общую переменную, нет гарантии (без синхронизации), что нить B когда-либо увидит изменения!
Таким образом, поток A может увеличивать i 100 раз, а через час поток B, вызывая getInt(), может видеть i как 0 или 100 или где-нибудь посередине!
Единственная нормальная вещь, которую нужно сделать, если вы вникаете в java-параллелизм, - это прочитать параллельность Java на практике Брайана Гетца и др. (OK есть, вероятно, другие хорошие способы, чтобы узнать об этом, но это большая книге со написано Джошуа Блох, Дуг Леа и другие)
Это удивительный вопрос, потому что Java является одним из немногих «интерпретируемых» языков с виртуальной машиной, которая имеет реальную поддержку потоковой передачи. Потоки Java действительно выполняются с собственными потоками, где такие языки, как Python, имеют поддельную поддержку потоков (я смотрю на вас, GIL). – vz0
Я нашел какое-то обсуждение [здесь] (http://programmers.stackexchange.com/questions/262428/race-conditions-in-jvm-languages-versus-cc), ожидая, чтобы увидеть, что SO должно сказать в глубине – mprabhat
it не делает. какая нить работает в первую очередь (что зависит от множества параметров, в том числе от внешних) выигрывает гонка. Результат обычно не предсказуем. Сама JVM даже не знает, что существует гонка данных. – njzk2