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
	})
}
如有疑问关注公众号给我留言
wx

关注公众号

©2017-2023 鲁ICP备17023316号-1 Powered by Hugo