Подписаться

Модель памяти Java

Последняя правка сделана 2021-05-24 03:57:54 Править

Модель памяти Java описывает, как потоки в программировании на Java язык взаимодействуют через память. Вместе с описанием однопоточного выполнения кода модель памяти обеспечивает семантику языка программирования Java.

Исходная модель памяти Java, разработанная в 1995 году, широко воспринималась как сломанная, препятствовавшая многим оптимизациям времени выполнения и не обеспечивающей достаточно надежных гарантий безопасности кода. Он был обновлен с помощью Java Community Process, как Java Specification Request 133 (JSR-133), который вступил в силу в 2004 году для Tiger (Java 5.0).

Содержание

  • 1 Контекст
  • 2 Модель памяти
  • 3 Воздействие
  • 4 См. Также
  • 5 Ссылки
  • 6 Внешние ссылки

Контекст

Язык программирования Java и платформа предоставляет возможности thread. Синхронизация между потоками, как известно, сложна для разработчиков; эта трудность усугубляется тем, что приложения Java могут работать на широком диапазоне процессоров и операционных систем. Чтобы сделать выводы о поведении программы, разработчики Java решили, что им необходимо четко определить возможное поведение всех программ Java.

На современных платформах код часто выполняется не в том порядке, в котором он был написан. Он переупорядочивается компилятором, процессором и подсистемой памяти для достижения максимальной производительности. В многопроцессорных архитектурах отдельные процессоры могут иметь свои собственные локальные кэши, которые не синхронизированы с основной памятью. Обычно нежелательно требовать, чтобы потоки оставались полностью синхронизированными друг с другом, потому что это было бы слишком дорого с точки зрения производительности. Это означает, что в любой момент времени разные потоки могут видеть разные значения для одних и тех же общих данных.

В однопоточной среде легко рассуждать о выполнении кода. Типичный подход требует, чтобы система реализовывала семантику «как если бы-последовательный» отдельно для отдельных потоков. Когда выполняется отдельный поток, будет казаться, что все действия, предпринимаемые этим потоком, происходят в том порядке, в котором они появляются в программе, даже если сами действия происходят не по порядку.

Если один поток выполняет свои инструкции не по порядку, то другой поток может увидеть тот факт, что эти инструкции были выполнены не по порядку, даже если это не повлияло на семантику первого потока. Например, рассмотрим два потока со следующими инструкциями, выполняющимися одновременно, где обе переменные x и y инициализируются значением 0:

Поток 1Поток 2
x = 1;int r1 = y;
y = 2;int r2 = x;

Если переупорядочение не выполняется и чтение y в потоке 2 возвращает значение 2, то последующее чтение x должно возвращать значение 1, потому что запись в x была выполнена до записи в y. Однако, если две записи переупорядочены, то чтение y может вернуть значение 2, а чтение x может вернуть значение 0.

Модель памяти Java (JMM) определяет допустимое поведение многопоточного программ, и поэтому описывает, когда такие переупорядочения возможны. Он накладывает ограничения на время выполнения на отношения между потоками и основной памятью, чтобы добиться согласованных и надежных приложений Java. Делая это, это позволяет рассуждать о выполнении кода в многопоточной среде, даже несмотря на оптимизацию, выполняемую динамическим компилятором, процессором (ами) и кешами.

Модель памяти

Для выполнения одного потока правила просты. Спецификация языка Java требует, чтобы виртуальная машина Java соблюдала семантику «как если бы последовательный» внутри потока. Среда выполнения (которая в данном случае обычно относится к динамическому компилятору, процессору и подсистеме памяти) может вводить любые полезные оптимизации выполнения, если результат изолированного потока гарантированно будет точно таким же, как и он. был бы, если бы все операторы выполнялись в том порядке, в котором они встречались в программе (также называемом программным порядком).

Основное предостережение в том, что семантика as-if-serial не препятствует выполнению различных потоков имея разные представления данных. Модель памяти дает четкое руководство о том, какие значения разрешено возвращать при чтении данных. Базовые правила подразумевают, что отдельные действия могут быть переупорядочены, если не нарушается семантика потока как если-последовательный, и действия, которые подразумевают обмен данными между потоками, такие как получение или снятие блокировки , убедитесь, что действия, которые происходят до них, видны другим потокам, которые видят их эффекты. Например, все, что происходит до снятия блокировки, будет рассматриваться как упорядоченное раньше и видимым для всего, что происходит после последующего получения той же самой блокировки.

Математически существует частичный порядок называется порядком происходит до для всех действий, выполняемых программой. Порядок «происходит до» включает в себя порядок программы; если одно действие происходит раньше другого в порядке выполнения программы, оно будет выполняться раньше другого в порядке выполнения. Кроме того, освобождение и последующее получение блокировок образуют ребра в графе «произошло до». При чтении разрешено возвращать значение записи, если эта запись является последней записью в эту переменную перед чтением по некоторому пути в порядке «произошло до» или если запись не упорядочена по отношению к этому чтению в случае перед заказом.

Воздействие

Модель памяти Java была первой попыткой предоставить всеобъемлющую модель памяти для популярного языка программирования. Это было оправдано растущим распространением параллельных и параллельных систем и необходимостью предоставить инструменты и технологии с четкой семантикой для таких систем. С тех пор потребность в модели памяти получила более широкое признание, с аналогичной семантикой, предоставленной для таких языков, как C ++.

См. Также

Ссылки

Внешние ссылки

Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: mail@alphapedia.ru
Соглашение
О проекте