Golang 并发编程sync包使用和示例代码

更新于 2022-10-29 10:29 36
专栏: Golang 标签: Go

介绍后期完善…

  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. )
  7. func main() {
  8. // syncMutex()
  9. // syncRWMutex()
  10. // syncMap()
  11. syncPool()
  12. }
  13. func syncMutex() {
  14. l := &sync.Mutex{}
  15. fmt.Println("程序启动")
  16. go lockMutexFunc(l)
  17. go lockMutexFunc(l)
  18. go lockMutexFunc(l)
  19. go lockMutexFunc(l)
  20. for {
  21. }
  22. }
  23. func lockMutexFunc(lock *sync.Mutex) {
  24. lock.Lock()
  25. fmt.Println("疯狂刮痧----")
  26. time.Sleep(1 * time.Second)
  27. lock.Unlock()
  28. }
  29. func syncRWMutex() {
  30. l := &sync.RWMutex{}
  31. fmt.Println("程序启动")
  32. go lockRWMutexFunc(l)
  33. go lockRWMutexFunc(l)
  34. go lockRWMutexFunc1(l)
  35. go lockRWMutexFunc1(l)
  36. go lockRWMutexFunc1(l)
  37. go lockRWMutexFunc1(l)
  38. for {
  39. }
  40. }
  41. func lockRWMutexFunc(lock *sync.RWMutex) {
  42. lock.Lock() // 写的时候排斥其他的写锁和读锁
  43. fmt.Println("疯狂治疗----")
  44. time.Sleep(1 * time.Second)
  45. lock.Unlock()
  46. }
  47. func lockRWMutexFunc1(lock *sync.RWMutex) {
  48. lock.RLock() // 读取的时候,不堵塞其他读锁,但是会排斥写锁
  49. fmt.Println("疯狂刮痧----")
  50. time.Sleep(1 * time.Second)
  51. lock.RUnlock()
  52. }
  53. func syncMap() {
  54. m := sync.Map{}
  55. m.Store(1, 1)
  56. m.Store(2, 2)
  57. m.Store(3, 3)
  58. m.Range(func(key, value interface{}) bool {
  59. fmt.Println(key, value)
  60. time.Sleep(1 * time.Second)
  61. return true // false 终止
  62. })
  63. }
  64. func syncPool() {
  65. p := &sync.Pool{}
  66. p.Put(1)
  67. p.Put(2)
  68. p.Put(3)
  69. p.Put(4)
  70. p.Put(5)
  71. p.Put(6)
  72. p.Put(7)
  73. for i := 0; i < 9; i++ {
  74. fmt.Println(p.Get())
  75. }
  76. }

BLOG

搜索文章