Модель памяти Go и Happens-Before
Гарантии синхронизации и порядок доступа к памяти
«Модель памяти Go и Happens-Before» — бесплатный урок Go Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Что такое модель памяти?
Модель памяти Go определяет, когда записи одной горутины в переменную гарантированно становятся видимыми для чтений другой горутины. Без этих гарантий параллельные программы могут наблюдать устаревшие или противоречивые значения.
Отношение «происходит до»
Отношение «происходит до» гарантирует, что все записи до события A видны в момент события B. Если такого отношения нет, чтения могут увидеть любую запись, включая нулевое значение.
Гарантированное отношение «происходит до»: запуск горутины
Всё, что происходит до оператора go, происходит до начала функции горутины. Запущенная горутина видит все записи, сделанные до её создания.
x := 10
go func() {
fmt.Println(x) // guaranteed to see 10
}()Гарантировано: отправка и получение по каналу
Отправка в канал происходит до соответствующего получения. Закрытие канала происходит до получения нулевого значения. Это основные примитивы синхронизации.
ch := make(chan int)
go func() { ch <- 42 }() // send hb receive
v := <-ch
fmt.Println(v) // guaranteed to see 42Гарантировано: sync.Mutex
n-й вызов Unlock мьютекса происходит до (n+1)-го вызова Lock. Благодаря этому горутина, захватывающая мьютекс после разблокировки, видит все записи, выполненные до разблокировки.
Гарантировано: sync.Once
Завершение функции once.Do происходит до возврата из любого вызова once.Do. Все горутины, вызывающие once.Do, видят результат инициализации.
Гарантировано: закрытие канала
Закрытие канала происходит до получения, возвращающего нулевое значение из закрытого канала. Так канал done передаёт сигнал множеству горутин.
Нет отношения «происходит до»: незащищённые общие переменные
Если две горутины обращаются к переменной без синхронизации и хотя бы одна из них выполняет запись, поведение не определено. Детектор состояний гонки обнаруживает такую проблему.
Атомарные операции
Пакет atomic предоставляет операции с последовательной согласованностью. Атомарная запись происходит до атомарного чтения той же переменной в любой горутине, которая наблюдает записанное значение.
Модель памяти для каналов
Для буферизованных каналов ёмкостью C k-е получение происходит до завершения (k+C)-й отправки. Это отражает ограниченную ёмкость буфера, обеспечивающую обратное давление.
Практическое правило
Если Вы делитесь данными между горутинами, используйте каналы для передачи владения либо мьютексы и атомарные операции для защиты чтений и записей. Не полагайтесь на интуитивное представление о порядке без синхронизации.
Быстрая проверка
Что из перечисленного создаёт отношение «происходит до» между горутинами?
Итоги: модель памяти Go
Основные положения:
- Отношение «происходит до» определяет, когда записи видимы между горутинами
- Каналы, Mutex, Once и запуск горутины создают связи HB
- Несинхронизированный доступ к общему изменяемому состоянию не определён
- Используйте детектор состояний гонки для обнаружения нарушений
Часто задаваемые вопросы
Урок «Модель памяти Go и Happens-Before» бесплатный?
Да — полный текст урока «Модель памяти Go и Happens-Before» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Модель памяти Go и Happens-Before»?
Гарантии синхронизации и порядок доступа к памяти Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Модель памяти Go и Happens-Before»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Стек и куча, анализ выхода за пределы стека
- Модель памяти Go и Happens-Before
- Внутреннее устройство сборщика мусора
- Сокращение выделений: sync.Pool и арены