===== sync package ===== ==== What is it? ==== `sync` is a Go standard library package that provides basic synchronization primitives for coordinating goroutines and protecting shared data. ==== What is it used for? ==== * Protect shared resources from concurrent access (locks). * Wait for multiple goroutines to finish. * Run one-time initialization safely. * Coordinate goroutines based on conditions. ==== Common types (overview) ==== * `Mutex`: mutual exclusion lock (one goroutine at a time). * `RWMutex`: read/write lock (many readers or one writer). * `WaitGroup`: wait for a set of goroutines to finish. * `Once`: run a function exactly once. * `Cond`: condition variable (wait/signal on state changes). * `Map`: concurrent map (special use cases; read docs carefully). * `Pool`: object pool to reduce allocations (advanced/perf). ==== Quick examples ==== === Mutex === var mu sync.Mutex mu.Lock() // critical section mu.Unlock() === RWMutex === var mu sync.RWMutex mu.RLock() // read-only section mu.RUnlock() mu.Lock() // write section mu.Unlock() === WaitGroup === var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() // work }() wg.Wait() === Once === var once sync.Once once.Do(func() { // init exactly once }) === Cond === mu := sync.Mutex{} cond := sync.NewCond(&mu) _ = cond ==== When to use sync vs channels ==== * Use `sync.Mutex`/`RWMutex` when you have shared mutable state (maps/slices/struct fields). * Use channels when you want to pass data between goroutines and structure concurrency as message passing. * Both are valid; choose the clearest, safest design. ==== Notes / pitfalls ==== * Do NOT copy structs containing `Mutex`, `RWMutex`, `WaitGroup`, `Once`, or `Cond` after first use. * Keep critical sections small (avoid slow I/O while holding locks). * Prefer `context` for cancellation/timeouts; `sync` does not cancel goroutines. ==== Related pages ==== * [[go:concurrency:mutex|sync.Mutex]] * [[go:concurrency:rwmutex|sync.RWMutex]] * [[go:concurrency:waitgroup|sync.WaitGroup]] * [[go:concurrency:once|sync.Once]] * [[go:concurrency:cond|sync.Cond]] * [[go:concurrency:atomic|sync/atomic]] * [[go:concurrency:race_detector|Race detector (-race)]] ==== Hard words (English) ==== * **synchronization** /ˌsɪŋkrənəˈzeɪʃən/: đồng bộ hoá * **primitive** /ˈprɪmətɪv/: thao tác/công cụ nền tảng * **coordinate** /koʊˈɔːrdɪneɪt/: điều phối * **concurrent** /kənˈkɝːənt/: đồng thời * **shared resource** /ʃerd rɪˈzɔːrs/: tài nguyên dùng chung * **critical section** /ˈkrɪtɪkəl ˈsekʃən/: vùng code cần khóa * **condition variable** /kənˈdɪʃən ˈveriəbəl/: biến điều kiện * **allocation** /ˌæləˈkeɪʃən/: cấp phát bộ nhớ * **mutable** /ˈmjuːtəbəl/: có thể thay đổi * **message passing** /ˈmesɪdʒ ˈpæsɪŋ/: truyền thông điệp * **cancellation** /ˌkænsəˈleɪʃən/: huỷ