sync.WaitGroup(计数器)

  1. package main
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "sync"
  6. "time"
  7. )
  8. func randNum(){
  9. rand.Seed(time.Now().UnixNano())
  10. for i := 0; i < 100; i++ {
  11. a := rand.Int()
  12. b := rand.Intn(10)
  13. fmt.Println(a,b)
  14. }
  15. }
  16. var wg sync.WaitGroup
  17. func main() {
  18. for i := 0; i < 10; i++ {
  19. wg.Add(1)
  20. go func(i int) {
  21. defer wg.Done()
  22. //如何知道写成社么时间结束
  23. time.Sleep(time.Second*time.Duration(rand.Intn(10)))
  24. fmt.Println(i)
  25. }(i)
  26. }
  27. wg.Wait()//等带计数器结束
  28. fmt.Println("22222")
  29. }

sync.Mutex(互斥锁)

  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. )
  6. func add() {
  7. for i := 0; i < 5000; i++ {
  8. lock.Lock()
  9. v++
  10. lock.Unlock()
  11. }
  12. wg.Done()
  13. }
  14. var v int
  15. //计时器
  16. var wg sync.WaitGroup
  17. //互斥锁
  18. var lock sync.Mutex
  19. //读写锁,读锁可以多个人同时获取,写锁智能一个人获取。当有人获取写锁进行写操作时,读锁和写锁都要进行等待
  20. var rwLock sync.RWMutex
  21. func main() {
  22. wg.Add(2)
  23. go add()
  24. go add()
  25. wg.Wait()
  26. fmt.Println(v)
  27. }

sync.RWMutex(读写锁)

  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. )
  7. var v int
  8. //计时器
  9. var wg sync.WaitGroup
  10. //互斥锁
  11. var lock sync.Mutex
  12. //读写锁,读锁可以多个人同时获取,写锁智能一个人获取。当有人获取写锁进行写操作时,读锁和写锁都要进行等待
  13. var rwLock sync.RWMutex
  14. func write() {
  15. rwLock.Lock()
  16. fmt.Println(v)
  17. v++
  18. rwLock.Unlock()
  19. wg.Done()
  20. }
  21. func read() {
  22. rwLock.RLock()
  23. fmt.Println(v)
  24. rwLock.RUnlock()
  25. wg.Done()
  26. }
  27. func main() {
  28. start := time.Now()
  29. for i := 0; i < 100; i++ {
  30. go write()
  31. wg.Add(1)
  32. }
  33. for i := 0; i < 1000; i++ {
  34. go read()
  35. wg.Add(1)
  36. }
  37. wg.Wait()
  38. fmt.Println(time.Now().Sub(start))
  39. }

sync.Once(高并发下某个操作只做一次)

  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. )
  7. var v int
  8. //计时器
  9. var wg sync.WaitGroup
  10. //互斥锁
  11. var lock sync.Mutex
  12. var once sync.Once
  13. func write() {
  14. once.Do(func() {
  15. v = 100
  16. })
  17. lock.Lock()
  18. v++
  19. lock.Unlock()
  20. wg.Done()
  21. }
  22. func main() {
  23. start := time.Now()
  24. wg.Add(100)
  25. for i := 0; i < 100; i++ {
  26. go write()
  27. }
  28. wg.Wait()
  29. //最总v的结果为200
  30. fmt.Println(v)
  31. fmt.Println(time.Now().Sub(start))
  32. }

sync.Map(并发map包)

  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. "sync"
  6. )
  7. var v int
  8. //计时器
  9. var wg sync.WaitGroup
  10. //互斥锁
  11. var lock sync.Mutex
  12. var once sync.Once
  13. //内置的map不是并发安全的
  14. var m1 = sync.Map{}
  15. var m2 = make(map[string]string)
  16. func main() {
  17. wg.Add(100)
  18. for i := 0; i < 100; i++ {
  19. go func(i int) {
  20. key := strconv.Itoa(i)
  21. m1.Store(key, key)
  22. value, _ := m1.Load(key)
  23. fmt.Println(value)
  24. wg.Done()
  25. }(i)
  26. }
  27. wg.Wait()
  28. wg.Add(100)
  29. //普通map最多只支持20个goroutine去并发修改,如果超过20会引发panic,需要加锁解决该问题,
  30. //go提供了sync.map来解决此问题
  31. for i := 0; i < 100; i++ {
  32. go func(i int) {
  33. key := strconv.Itoa(i)
  34. m2[key] = key
  35. value := m2[key]
  36. fmt.Println(value)
  37. wg.Done()
  38. }(i)
  39. }
  40. wg.Wait()
  41. }