[БЕЗ_ЗВУКА] Итак, каким образом нам обезопасить наши данные от состояния гонки? Одним из инструментов, которые предлагает стандартная библиотека 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-ами есть некоторые нюансы.