Go中的锁都在sync包下面

sync.Mutex

常见的互斥锁

sync.RWMutex

常见的读写锁

sync.Once

一种特殊的锁,只有一个暴露的方法Do,其接收一个函数作为参数,并保证这个函数只会执行一次。(用来做懒加载)如下所示的PopCount函数,其作用是统计一个64位变量中比特1的个数,需要一个pc辅助数组,用以下的方式可以保证pc数组的懒加载。

  1. var loadPcOnce sync.Once
  2. // pc[i] is the population count of i.
  3. var pc [256]byte
  4. func initPc() {
  5. for i := range pc {
  6. pc[i] = pc[i/2] + byte(i&1)
  7. }
  8. }
  9. // PopCount returns the population count (number of set bits) of x.
  10. func PopCount(x uint64) int {
  11. loadPcOnce.Do(initPc)
  12. return int(pc[byte(x>>(0*8))] +
  13. pc[byte(x>>(1*8))] +
  14. pc[byte(x>>(2*8))] +
  15. pc[byte(x>>(3*8))] +
  16. pc[byte(x>>(4*8))] +
  17. pc[byte(x>>(5*8))] +
  18. pc[byte(x>>(6*8))] +
  19. pc[byte(x>>(7*8))])
  20. }