Squeak.ru - шаблоны программирования

Выполняет ли энергозависимое чтение с флэш-записью Java и выполняет чтение с обновлением изменчивой записи

Я понимаю, что такое чтение-получение (не меняет порядок с последующими операциями чтения / записи после него) и запись-освобождение (не меняет порядок с предшествующими операциями чтения / записи). Мой вопрос: -

  1. В случае чтения-получения сбрасываются ли предшествующие записи?
  2. В случае записи-выпуска обновляются ли предыдущие чтения?

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

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

y = x; // a read.. let's say x is 1 at this point
System.out.println(y);// 1 printed
//or you can also consider System.out.println(x);
write_release_barrier();
//somewhere here, some thread sets x = 2
ready = true;// this is volatile
System.out.println(y);// or maybe, println(x).. what will be printed?

На данный момент x 2 или 1? Вот считай, готов быть нестабильным. Я понимаю, что сначала будут сделаны видимыми все хранилища до volatile .. а затем будут видны только volatile. Спасибо.

Ссылка: - http://preshing.com/20120913/acquire-and-release-semantics/

04.03.2016

Ответы:


1

Нет: не все записи сбрасываются и не все чтения обновляются.

Java работает по принципу «случилось раньше» для многопоточности. По сути, если A происходит до B, а B происходит до C, то A происходит до C. Итак, ваш вопрос сводится к тому, происходит ли x=2 формально до некоторого действия, которое читает x.

Границы "Случается до" в основном устанавливаются отношениями "синхронизируется с", которые определены в JLS 17.4.4. Есть несколько разных способов сделать это, но для volatiles это в основном означает запись в volatile, происходящую перед чтением в тот же volatile:

  • Запись в изменчивую переменную v (§8.3.1.4) синхронизирует все последующие чтения v любым потоком (где «последующие» определены в соответствии с порядком синхронизации).

Учитывая это, если ваш поток пишет ready = true, тогда эта запись сама по себе не означает, что-либо происходит до этого (что касается этой записи). На самом деле все наоборот; эта запись в ready происходит раньше, чем в других потоках, если они читают ready.

Итак, если другой поток (который устанавливает x = 2) написал в состояние готовности после, он установил x = 2, а этот поток (который вы разместили выше) тогда прочитал ready, тогда он бы см. x = 2. Это потому, что запись происходит до чтения, и поэтому поток чтения видит все, что сделал поток записи (вплоть до записи). В противном случае у вас будет гонка за данными, и в основном все ставки отключены.

Пара дополнительных примечаний:

  • Если у вас нет края «произошло раньше», вы можете по-прежнему увидеть обновление; просто вам это не гарантировано. Поэтому не думайте, что если вы не прочитаете запись в ready, вы все равно увидите x = 1. Вы можете увидеть x = 1 или x = 2, или, возможно, какую-то другую запись (до значения по умолчанию x = 0 включительно)
  • В вашем примере y всегда будет 1, потому что вы не перечитываете x после комментария «где-то здесь». Для этого ответа я предположил, что есть вторая строка y=x непосредственно перед или после ready = true. Если нет, тогда значение y не изменится по сравнению с тем, что было в первом println (при условии, что никакой другой поток не изменяет его напрямую - что гарантировано, если это локальная переменная), потому что действия внутри потока всегда выглядят так, как если бы они были не переупорядочивал.
05.03.2016

2

Модель памяти Java не определяется в терминах «чтение-получение» и «запись-освобождение». Эти термины / концепции взяты из других контекстов, и, как ясно показывает статья, на которую вы ссылаетесь, они часто используются (разными экспертами) для обозначения разных вещей.

Если вы хотите понять, как volatiles работают в Java, вам необходимо понять модель памяти Java и терминологию Java ... которая (к счастью) хорошо обоснована и точно указана 1. Попытка сопоставить модель памяти Java с семантикой «чтение-получение» и «запись-выпуск» - плохая идея, потому что:

  • Терминология и семантика «чтение-получение» и «запись-освобождение» не определены должным образом, и

  • гипотетическое семантическое отображение JMM -> «чтение-получение» / «запись-освобождение» - лишь одна из возможных реализаций JMM. Другие сопоставления могут существовать с другой и одинаково допустимой семантикой.


1 - ... по модулю того, что эксперты отметили недостатки в некоторых версиях JMM. Но дело в том, что была предпринята серьезная попытка предоставить теоретически обоснованную спецификацию ... как часть Спецификации языка Java.

05.03.2016

3

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

Нет, запись в изменчивую переменную не очистит кеш от ранее прочитанных значений. Гарантируется только сброс предыдущих записей.

В вашем примере ясно, что y по-прежнему будет 1 в последней строке. y было сделано только одно присвоение, и это было 1, согласно предыдущим выводам. Возможно, это была опечатка, и вы хотели написать println(x), но даже в этом случае значение 2 не гарантируется.

05.03.2016

4

На ваш 1-й вопрос ответьте, что порядок FIFO

Для вашего второго вопроса: пожалуйста, проверьте Volatile Vs Static в java

05.03.2016
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...