Зачем определять модель памяти Java? - PullRequest
1 голос
/ 27 мая 2020
Многопоточный код

Java наконец отображается на поток операционной системы для выполнения.

Является ли поток операционной системы потокобезопасным?

Зачем использовать модель памяти Java для обеспечения безопасности потоков? Зачем определять модель памяти Java?

Надеюсь, кто-то сможет ответить на этот вопрос, я просмотрел много информации по Inte rnet, но все еще не понимаю!

Все материалы в Интернете посвящены атомарности, видимости, упорядоченности и использованию модели согласованности кеша в качестве примера, но я не думаю, что это действительно отвечает на вопрос.

большое спасибо!

Ответы [ 3 ]

1 голос
/ 27 мая 2020

Каждый язык программирования, который серьезно относится к параллелизму, нуждается в модели памяти - и вот почему.

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

Это отрывок из статьи Модели памяти для C / Программисты на C ++ , соавтором которых я являюсь. Несмотря на то, что большая часть его посвящена модели памяти C ++, она также охватывает более общие области - начиная с причины, по которой нам в первую очередь нужна модель памяти, объясняет (интуитивно понятную) последовательную последовательную модель и, наконец, более слабую модели памяти, предоставляемые текущим оборудованием в процессорах x86 и ARM / POWER.

1 голос
/ 27 мая 2020

Модель памяти Java отвечает на следующий вопрос: что произойдет, если несколько потоков изменят одну и ту же ячейку памяти.

И ответ, который дает модель памяти: если программа не имеет гонок данных, то все выполнения программы будут выглядеть последовательно согласованными.

Есть отличная статья Сариты В. Адве, Ханса-Дж. Бем о том, почему модели памяти Java и C ++ разработаны таким образом: Модели памяти: случай переосмысления параллельных языков и оборудования

Из статьи:

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

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

1 голос
/ 27 мая 2020

Поток операционной системы не является потокобезопасным (это утверждение не имеет большого смысла, но в основном операционная система не гарантирует соблюдение предполагаемой атомарности вашего кода).

Проблема состоит в том, что два элемента данных связаны и, следовательно, должны быть синхронизированы, действительно понимает только ваше приложение.

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

«Модель памяти» Java довольно близка к аппаратной модели. Есть стек для примитивов, а объекты размещаются в куче. Обеспечивается синхронизация, чтобы позволить программисту заблокировать доступ к общим данным в куче. Кроме того, существуют правила, которым должен следовать оптимизатор, чтобы оптимизация не нарушала установленную синхронизацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...