并发会产生的问题 -竞争

11.3.1 并发产生问题的代码

  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. )
  6. var total int
  7. var wg sync.WaitGroup
  8. func add(){
  9. defer wg.Done()
  10. for i := 0; i < 100000; i ++ {
  11. total += 1
  12. }
  13. }
  14. func sub(){
  15. defer wg.Done()
  16. for i := 0; i < 100000; i ++ {
  17. total -= 1
  18. }
  19. }
  20. func main(){
  21. wg.Add(2)
  22. go add()
  23. go sub()
  24. wg.Wait()
  25. fmt.Println(fmt.Sprintf("total is: %d", total))
  26. }

11.3.2 通过互斥锁解决并发问题

  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. )
  6. var total int
  7. var wg sync.WaitGroup
  8. var lock sync.Mutex
  9. func add(){
  10. defer wg.Done()
  11. for i := 0; i < 100000; i ++ {
  12. lock.Lock()
  13. total += 1
  14. lock.Unlock()
  15. }
  16. }
  17. func sub(){
  18. defer wg.Done()
  19. for i := 0; i < 100000; i ++ {
  20. lock.Lock()
  21. total -= 1
  22. lock.Unlock()
  23. }
  24. }
  25. func main(){
  26. wg.Add(2)
  27. go add()
  28. go sub()
  29. wg.Wait()
  30. fmt.Println(fmt.Sprintf("total is: %d", total))
  31. }

11.3.3 读写锁

  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. )
  7. var rwLock sync.RWMutex
  8. var wg sync.WaitGroup
  9. func read(){
  10. defer wg.Done()
  11. rwLock.RLock()
  12. fmt.Println("读取数据")
  13. time.Sleep(time.Second)
  14. fmt.Println("读取成功")
  15. rwLock.RUnlock()
  16. }
  17. func write(){
  18. defer wg.Done()
  19. rwLock.Lock()
  20. fmt.Println("修改数据")
  21. time.Sleep(time.Second*10)
  22. fmt.Println("修改成功")
  23. rwLock.Unlock()
  24. }
  25. func main() {
  26. wg.Add(10)
  27. for i := 0;i<5;i++ {
  28. go read()
  29. }
  30. for i := 0;i<5;i++ {
  31. go write()
  32. }
  33. wg.Wait()
  34. }