[БЕЗ_ЗВУКА] Итак,
каким образом нам обезопасить наши данные от состояния гонки?
Одним из инструментов, которые предлагает стандартная библиотека go для этих целей,
конечно же является Mutex.
Давайте посмотрим, как с ним работать.
Итак, на строчке 10 мы создаем Mutex, создаем его, как ссылку на объект.
Дело в том, что Mutex в связи со своей внутренней реализацией не должен быть
копирован после первого использования, как значение.
Поэтому всегда создавайте его, как ссылку на объект,
и передавайте тоже ссылку на него.
После его создания мы передаем его в нашу go-рутину,
и внутри go-рутины Mutex выполняет основную свою работу.
То есть перед началом работы с данными
мы берем lock на эти данные, точнее на этот Mutex.
То есть мы говорим, что я залочился, я взял права
на работу с этими данными, пожалуйста, больше никто другой не работайте с ними.
Все другие, кто попробует взять lock, они будут ожидать.
После этого дела я на строчке 15 уже работаю непосредственно с данными.
И на строчке 16 я снимаю
lock на данные, ну то есть освобождаю его,
говоря, что теперь все, кто хочет, берите следующий, работайте дальше.
Вроде бы все работает.
Давайте теперь запустим нашу программу.
[ЗВУК] Итак,
наша программа успешно отработала.
Вроде бы все хорошо, но давайте посмотрим, что на это скажет race detector.
go run -race
[ЗВУК] Опа.
Программа отработала,
но race detector по-прежнему ругается.
На что он ругается?
Он ругается на строчку 15.
Строчка 15 — это как раз таки изменение данных.
Ну, тут вроде бы мы защитились.
А что еще?
Ага.
И строчка 21.
Что находится на строчке 21?
На строчке 21 мы обращаемся к этим данным,
то есть race detector смотрит, что мы не просто в каких-то местах,
где мы изменяем эти данные, но и в тех местах, где мы обращаемся к мапе.
Мапа полностью небезопасна, то есть вдруг если мы в этом месте мы защитились,
на строчке 15, там, где мы изменяем,
но вдруг в каком-то месте мы пытаемся обратиться, то есть прочитать эти данные.
В то же время мы с другой стороны, вроде бы защитившись, мы их изменяем.
Все равно будет ошибка.
Поэтому, чтобы race detector был спокоен, нам придется и обращение
к данным тоже покрыть lock-ом на Mutex.
Давайте запустим теперь.
Итак, запускаем с ключом race,
и race detector не заругался, то есть мы успешно защитили
наши данные от race condition.
Но при работе с Mutex-ами есть некоторые нюансы.