При изучении Java Concurrency by Brian Goetz на практике я наткнулся на следующую строку:
Гонка данных происходит, когда переменная читается более чем одним потоком и записывается как минимум одним потоком, но операции чтения и записи не упорядочены по принципу «происходит до». В правильно синхронизированной программе нет гонок данных; правильно синхронизированные программы демонстрируют последовательную согласованность, что означает, что все действия в программе происходят в фиксированном глобальном порядке.
Мой вопрос заключается в том, что Is Out of Order пишет единственную причину состояния гонки данных в java или, возможно, в других языках программирования?
ОБНОВЛЕНИЕ
Хорошо, я провел дополнительное исследование данных. race и нашел следующее на официальном сайте oracle в котором говорится, что:
Анализатор потоков обнаруживает гонки данных, возникающие во время выполнения многопоточного процесса. Гонка данных возникает, когда:
- два или более потока в одном процессе одновременно обращаются к одной и той же ячейке памяти, и
- по крайней мере один из доступов предназначен для записи, и
- потоки не используют никаких монопольных блокировок для управления своим доступом к этой памяти.
Когда выполняются эти три условия, порядок доступа является недетерминированным, и вычисления могут давать разные результаты от запуска к запуску в зависимости от этого порядка. Некоторые гонки данных могут быть безобидными (например, когда доступ к памяти используется для ожидания занятости), но многие гонки данных являются ошибками в программе.
В этой части упоминается, что: порядок доступа не является детерминированным
Речь идет о последовательности, в которой потоки обращаются к ячейке памяти? Если да, то синхронизация никогда не гарантирует порядок, в котором потоки будут обращаться к блоку кода. Итак, как синхронизация может решить проблему гонки данных?
java.util.concurrent.atomic.*
), гарантируют, что операции упорядочены. Таким образом, если один поток обновляет атомарную переменную, обновление происходит до всех последующих операций чтения. Сама атомарная операция устанавливает барьер памяти. Если вы не можете обновить переменную атомарно (или с синхронизацией или блокировками), то могут произойти случаи, подобные упомянутым в комментарии @BrettOkken. - person James   schedule 06.07.2014Is Out of Order writes the only reason for Data Race condition?
Запись вне очереди происходит с гонками данных или без них. Они определенно не являются причиной для гонок данных; однако наличие гонок данных означает, что неупорядоченные записи могут наблюдаться другими потоками, что нарушает причинно-следственную связь. - person Marko Topolnik   schedule 06.07.2014