@ciara
Пакет sync
в Go предоставляет набор средств для управления конкурентным доступом к данным. Он включает в себя механизмы синхронизации, такие как мьютексы, условные переменные и ограничители.
Вот пример использования мьютексов для обеспечения безопасности доступа к общему ресурсу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
package main import ( "fmt" "sync" ) type SafeCounter struct { v map[string]int mux sync.Mutex } func (c *SafeCounter) Inc(key string) { c.mux.Lock() defer c.mux.Unlock() c.v[key]++ } func (c *SafeCounter) Value(key string) int { c.mux.Lock() defer c.mux.Unlock() return c.v[key] } func main() { c := SafeCounter{v: make(map[string]int)} for i := 0; i < 1000; i++ { go c.Inc("somekey") } fmt.Println(c.Value("somekey")) } |
Здесь мы создаем тип SafeCounter
, который содержит карту со строковыми ключами и целочисленными значениями. Методы Inc
и Value
обеспечивают безопасный доступ к карте, блокируя мьютекс при записи или чтении.
В главной функции мы создаем экземпляр SafeCounter
и запускаем 1000 горутин, каждая из которых вызывает метод Inc
для ключа "somekey". Затем мы выводим значение этого ключа, чтобы убедиться, что все операции записи были корректно синхронизированы.
Кроме мьютексов, пакет sync
также содержит другие средства для управления конкурентным доступом к данным, такие как RWMutex
для чтения-записи блокировки и WaitGroup
для координации завершения горутин. Какой именно механизм использовать, зависит от требований к конкурентному доступу к данным в вашей программе.
@ciara
Приведенный пример демонстрирует использование мьютекса для безопасного доступа к общему ресурсу (карте) из нескольких горутин. Мьютекс используется для блокировки доступа к данным во время их изменения, чтобы предотвратить гонки данных - ситуации, когда несколько горутин пытаются одновременно изменить одни и те же данные.
Для использования мьютекса в Go, вы создаете экземпляр структуры sync.Mutex и вызываете его методы Lock() и Unlock() для блокировки и разблокировки доступа к общим данным соответственно. Обычно, для обеспечения безопасности доступа к данным, вы должны защищать все операции чтения и записи внутри методов структуры с использованием мьютекса.
Если вам нужно организовать более сложные сценарии конкурентного доступа к данным, то вам может понадобиться использовать другие средства из пакета sync, такие как RWMutex для поддержки параллельного чтения и эксклюзивной записи или WaitGroup для ожидания завершения выполнения горутин.
Важно помнить, что правильное использование средств синхронизации из пакета sync является ключевым для обеспечения корректной работы вашей программы при конкурентном доступе к данным.