Одна горутина записывает значение и выставляет
done = true. Другая ждёт этот флаг и читает результат. Программа выводит правильный ответ, но без синхронизации такой код содержит data race.В статье разбирают:
* когда изменения памяти становятся видимыми другим горутинам;
* как компилятор и процессор могут менять порядок операций;
* что гарантирует отношение happens-before;
* как атомики, мьютексы и каналы обеспечивают синхронизацию;
* почему гонки при работе со строками, срезами и интерфейсами особенно опасны.
С примерами кода, выводом
go run -race и экспериментом, где две горутины одновременно прочитали старые значения.https://func25.dev/posts/go-memory-visibility/
#Go #Golang
