wx

关注公众号

sync


Golang 标准库 - sync

sync 包提供了基本的同步原语,如互斥锁。除了 Once 和 WaitGroup 类型外,大多数类型都是为低级库例程设计的。更高级的同步应优先通过 channel 和通信来完成。

主要功能说明:

  1. Mutex(互斥锁):

    • Lock() 加锁
    • Unlock() 解锁
    • 保护临界区
  2. RWMutex(读写锁):

    • RLock()/RUnlock() 读锁
    • Lock()/Unlock() 写锁
    • 允许多个读或单个写
  3. WaitGroup:

    • Add() 添加计数
    • Done() 完成计数
    • Wait() 等待完成
  4. Once:

    • Do() 只执行一次
    • 用于单例初始化
  5. Map:

    • 并发安全的 map
    • Store/Load/Delete 操作

func main() {
	// 1. Mutex 互斥锁
	fmt.Println("=== Mutex 互斥锁 ===")
	var mu sync.Mutex
	counter := 0

	var wg sync.WaitGroup
	for i := 0; i < 100; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			mu.Lock()
			counter++
			mu.Unlock()
		}()
	}
	wg.Wait()
	fmt.Println("Counter:", counter) // 100

	// 2. RWMutex 读写锁
	fmt.Println("\n=== RWMutex 读写锁 ===")
	var rwmu sync.RWMutex
	data := make(map[string]int)

	// 写操作
	go func() {
		rwmu.Lock()
		data["key"] = 42
		rwmu.Unlock()
	}()

	// 读操作
	go func() {
		rwmu.RLock()
		value := data["key"]
		rwmu.RUnlock()
		fmt.Println("Read value:", value)
	}()

	time.Sleep(100 * time.Millisecond)

	// 3. Once 只执行一次
	fmt.Println("\n=== Once 只执行一次 ===")
	var once sync.Once
	for i := 0; i < 5; i++ {
		once.Do(func() {
			fmt.Println("This will only print once")
		})
	}

	// 4. Sync Map
	fmt.Println("\n=== Sync Map ===")
	var sm sync.Map

	// 存储
	sm.Store("name", "Alice")
	sm.Store("age", 30)

	// 读取
	if value, ok := sm.Load("name"); ok {
		fmt.Println("name:", value)
	}

	// 遍历
	sm.Range(func(key, value interface{}) bool {
		fmt.Printf("%v: %v\n", key, value)
		return true
	})
}
🛒 站长推荐(京东联盟)

以上链接含京东联盟推广代码;通过链接购买本站可能获得少量佣金,不影响你的购买价格。

📮 关注公众号「GO语言入门之路」
GO语言入门之路 公众号二维码

每周更新 Go + AI 应用开发实战:AI 面试官完整项目、MCP、Agent 工程化,完整源码随文章首发。

微信扫码,或搜索「GO语言入门之路」关注,第一时间获取系列更新与源码,不再错过任何一篇。

如有疑问关注公众号给我留言
wx

关注公众号

©2017-2026 鲁ICP备17023316号-1 Powered by Hugo · 隐私政策