1 происходит раньше 2, почему?
Я не на 100% уверен, что понимаю ваш вопрос.
Если у вас есть изменчивая переменная a
и один поток читает из нее, а другой записывает в нее, порядок этих обращений может быть в любом порядке. Это состояние гонки. Что гарантируется JVM и моделью памяти Java (JMM), зависит от того, какая операция выполняется первой.
Запись могла произойти только что, и при чтении будет обнаружено обновленное значение. Или запись могла произойти после чтения. Таким образом, x
может быть либо 5
, либо предыдущим значением a
.
каждое последовательное выполнение согласованности должно происходить до связи между этими обращениями
Я не уверен, что это значит, поэтому постараюсь уточнить. Связь «происходит до» с volatile
означает, что все предыдущие записи памяти в переменную volatile
до чтения той же переменной гарантированно завершены. Но эта гарантия никоим образом не объясняет время между двумя volatile
операциями, которые зависят от состояния гонки. Читатель гарантированно видел запись, но только, если запись произошла до чтения.
Вы можете подумать, что это довольно слабая гарантия, но в потоках, производительность которых значительно улучшена за счет использования локального кеша ЦП, чтение значения поля может происходить из сегмента кэшированной памяти, а не из центральной памяти. Гарантия имеет решающее значение для обеспечения того, чтобы локальная память потока была недействительной и обновлялась при чтении volatile
, чтобы потоки могли надлежащим образом обмениваться данными.
Опять же, JVM и JMM гарантируют, что если вы читаете из поля volatile
a
, то любые записи в это же поле, которые произошли до чтения, будут видны им - записанное значение будут правильно опубликованы и видны читающей ветке. Однако эта гарантия никоим образом не определяет порядок заказа. Он не говорит, что запись должна произойти до чтения.
person
Gray
schedule
17.05.2013