sync.Mutex互斥锁

  1. import "sync"
  2. var (
  3. mu sync.Mutex // guards balance
  4. balance int
  5. )
  6. func Deposit(amount int) {
  7. mu.Lock()
  8. balance = balance + amount
  9. mu.Unlock()
  10. }
  11. func Balance() int {
  12. mu.Lock()
  13. b := balance
  14. mu.Unlock()
  15. return b
  16. }

sync.RWMutex读写锁

RWMutex只有当获得锁的大部分goroutine都是读操作,而锁在竞争条件下,也就是说,goroutine们必须等待才能获取到锁的时候,RWMutex才是最能带来好处的。RWMutex需要更复杂的内部记录,所以会让它比一般的无竞争锁的mutex慢一些。

sync.Once初始化

如果初始化成本比较大的话,那么将初始化延迟到需要的时候再去做就是一个比较好的选择。如果在程序启动的时候就去做这类的初始化的话会增加程序的启动时间并且因为执行的时候可能也并不需要这些变量所以实际上有一些浪费。

  1. var loadIconsOnce sync.Once
  2. var icons map[string]image.Image
  3. // Concurrency-safe.
  4. func Icon(name string) image.Image {
  5. loadIconsOnce.Do(loadIcons)
  6. return icons[name]
  7. }

可用于单例模式