Всем привет!
Помогите навести порядок в голове по Go и concurrency. Читаю книгу Донована и Кернигана, где есть пример про параллельный неблокирующий кеш (часть 9.7).
На этой странице выделил желтым предложение, которое меня смущает:
https://i.imgur.com/7XkoPh2.png
Они говорят, что мьютекс
не является необходимым. Если открыть сам
код, и предположить что мьютексов нету, на 34 строке мы получаем значение из хэш-таблицы. Далее, сравниваем его с nil и создаем новое значение
entry
, которое в итоге записываем обратно в хеш-таблицу. В это же время происходит чтение из хэш-таблицы другой goroutine, которая получает nil, и делает абсолютно то же самое что и предыдущая (в данном примере автор хотел сделать так, чтобы если одна гоурутина занимается вычислением тяжелой функции, другая не делала тоже самое, а ждала пока goroutine-основная закончил свою работу). Получается, что операция записи и чтения создают гонку данных. Race детектор говорит тоже самое.
Код:
https://pastebin.com/LMmj3vGn