English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Иногда оптимизация компилятора и процессора может привести к тому, что runtime будет отличаться от нашего представления, поэтому Java установила некоторые ограничения для компиляторов и процессоров. JAVA Memory Model (JMM) abstracts these out, чтобы при написании кода не нужно было думать о那么多底层 деталей, и гарантирует, что «если следовать правилам JMM при написании программы, её результат всегда будет правильным».
Абстрактная структура JMM
Во всех экземплярах Java и статических переменных хранятся в памяти heaps, которая может быть shared между потоками. Это также называетсяОбщие переменныеА локальные переменные, параметры метода и параметры обработки исключений хранятся в стуке, который не.shared между потоками.
А оптимизация компилятора и процессора может привести к проблемам видимости общей переменной, например, в многоядерных процессорах (multi-processor), нити могут выполняться на различных процессорах, аНепоследовательность кэшей процессоров приводит к проблемам видимости общей переменной., возможно, что две нити видят разное значение одной и той же переменной.
JMM абстрагирует оптимизации оборудования, предоставляя каждой нити локальную память. При необходимости чтения и записи общей переменной копируется один экземпляр из основной памяти в локальную память. При записи общей переменной сначала пишется в локальную память, а затем в будущем обновляется в основную память. При повторном чтении общей переменной будет читаться только из локальной памяти.
Таким образом, общение между нитью требует двух шагов:
Написание потока: обновление локальной памяти в основную память. Чтение потока: чтение обновленного значения из основной памяти.
Таким образом, между записью и чтением есть задержка: когда локальная память обновляется в основную память? Это вызывает проблему видимости, и различные нити могут видеть различные значения общей переменной.
happens-before
С точки зрения языка, happens-before означает “произошедшее до”. Это правила выполнения программы, установленные Java, для обеспечения синхронизации необходимо следовать этим правилам. Таким образом, программисту нужно только написать правильную синхронизационную программу, и happens-before гарантирует, что результат выполнения не будет неправильным.
A предшествует B, это не только означает, что A выполняется до B, но также означает, что результат выполнения A виден для B, что гарантирует видимость.
A предшествует B, A не обязательно должно выполняться до B. Если А и В чередуются, результат выполнения все равно будет правильным, что позволяет компилятору и процессору оптимизировать и перераспределить порядок выполнения. Поэтому, если результат программы правильный, то как бы компилятор и процессор оптимизировали и перераспределяли порядок выполнения, это не имеет значения, это все равно хорошо.
Правила happens-before
Правила последовательности программы: в одной нити, операция, которая выполняется перед другой, является предшествующей. Правила блокировки: для одного и того же замка, разблокировка предшествует блокировке. Правила области volatile: запись в переменную volatile предшествует любому чтению этой переменной. Принцип передачи: если A предшествует B, а B предшествует C, то A предшествует C. Правила start(): если нить A выполняет ThreadB.start(), то ThreadB.start() предшествует любым операциям в нити B. Правила join(): если нить A выполняет ThreadB.join(), то все операции в нити B предшествуют ThreadB.join().
Этот пример поможет понять happens-before
double pi = 3.14; //A double r = 1.0; //B double area = pi * r * r; //C
Здесь есть три happens-before отношений, правило 1 и 2 - это правила программной последовательности, правило 3 выведено из транситивного правила:
A happens-before B, B happens-before C, A happens-before C
C зависит от A и B, но ни A, ни B не зависят от кого-либо. Поэтому даже если A и B будут реорганизованы, результат выполнения не изменится, этот реорганизованный процесс управляется JMM.
Результат выполнения обоих порядков является правильным.
Вот все, что мы собрали для вас о науке Java Memory Model JMM, если у вас есть больше вопросов, пожалуйста, оставляйте комментарии в нижней части, спасибо за поддержку урока крика.
Заявление: данное содержимое получено из Интернета, авторские права принадлежат соответствующему автору. Содержимое предоставлено пользователями Интернета, самостоятельно загруженным, сайт не обладает правами собственности, не был обработан редакторами, также не несет ответственности за соответствующие юридические вопросы. Если вы обнаружите контент,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (при отправке письма, пожалуйста, замените # на @) для отчета, и предоставьте соответствующие доказательства. При обнаружении фактов, сайт немедленно удалит涉嫌侵权的内容.