Что такое «синхронизированные барьеры»? - PullRequest
4 голосов
/ 12 июля 2020

Недавно я читал страницу The JSR-133 Cookbook for Compiler Writers от Дуга Ли относительно JSR 133: Модель памяти JavaTM и версия спецификации потока .

Там я прочитал эту строку:

Барьеры памяти сами по себе не «барьеры синхронизации»

Я искал найти ресурсы о различиях между барьерами памяти и синхронизированными барьерами , но не смог найти ничего хорошего. Я также не могу сказать, имеет ли синхронизированные барьеры какие-либо различия по сравнению с Java с другими языками.

Ответы [ 2 ]

5 голосов
/ 12 июля 2020

Прежде всего, как указывает @markspace, документ, который вы просматриваете, не предназначен как документ для Java программистов, пытающихся понять, как правильно писать многопоточный код.

«Это неофициальное руководство по реализации новой модели Java памяти (JMM)»

Так что, если вы читаете его для этой цели, вы, вероятно, запутаетесь без надобности. Вместо этого вы должны либо использовать механизмы параллелизма более высокого уровня Java (лучше всего!), Либо прочитать и понять спецификацию JMM c.

Барьер синхронизации (не «синхронизированный барьер») (я полагаю) относится к терминологии модели памяти Java.

JLS 17.4.4 определяет синхронизирует связь с между различными действиями. Это отношение подразумевает синхронизацию между двумя потоками:

Источник синхронизирует-с ребром называется release , а место назначения называется получить .

Я не уверен в этом (потому что в документе Cookbook не уточняется), но я думаю, что это "барьер синхронизации" в Cookbook относится к физической реализации synchronizes-with edge ... что бы это ни было.

Итак, в документе говорится, что барьеры памяти, на которые он ссылается, не являются то же самое, что и механизмы, реализующие блокировки и так далее. Что на самом деле очевидно.

3 голосов
/ 12 июля 2020

Посмотрите на имя ... ... for compiler writers, должно быть понятно. Дуг Ли, среди других людей, создал черновик документа (отправную точку), с которого авторы компилятора могут начать.

Проблема в том, что JVM может go дальше или полностью игнорировать этот документ, пока это будет законно. Например:

public void go() {
    
     synchronized(this) {
        int x = 1;
     }

     synchronized(this) {
        int y = 2;
     }

}

В этом документе говорится, что будут вставлены «барьеры памяти», в основном x = 1 и y = 2 не могут перемещаться за пределы синхронизированного блока. На практике JVM выполнит:

   public void go() {
    
     synchronized(this) {
        int x = 1;
        int y = 2;
     }

}

, что является оптимизацией, называемой «укрупнением блокировки», без каких-либо проблем. Таким образом, документ на самом деле является лишь отправной точкой для определения некоторых базовых c правил.

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

...