github.com/nibnait/go-learn@v0.0.0-20220227013611-dfa47ea6d2da/src/test/chapter/ch9/02_lock/lock_test.go (about) 1 package lock_test 2 3 import ( 4 "fmt" 5 "sync" 6 "testing" 7 ) 8 9 var cache map[string]string 10 11 const NUM_OF_READER int = 40 12 const READ_TIMES = 100000 13 14 func init() { 15 cache = make(map[string]string) 16 17 cache["a"] = "aa" 18 cache["b"] = "bb" 19 } 20 21 func lockFreeAccess() { 22 23 var wg sync.WaitGroup 24 wg.Add(NUM_OF_READER) 25 for i := 0; i < NUM_OF_READER; i++ { 26 go func() { 27 for j := 0; j < READ_TIMES; j++ { 28 _, err := cache["a"] 29 if !err { 30 fmt.Println("Nothing") 31 } 32 } 33 wg.Done() 34 }() 35 } 36 wg.Wait() 37 } 38 39 func lockAccess() { 40 41 var wg sync.WaitGroup 42 wg.Add(NUM_OF_READER) 43 m := new(sync.RWMutex) 44 for i := 0; i < NUM_OF_READER; i++ { 45 go func() { 46 for j := 0; j < READ_TIMES; j++ { 47 48 m.RLock() 49 _, err := cache["a"] 50 if !err { 51 fmt.Println("Nothing") 52 } 53 m.RUnlock() 54 } 55 wg.Done() 56 }() 57 } 58 wg.Wait() 59 } 60 61 func BenchmarkLockFree(b *testing.B) { 62 b.ResetTimer() 63 for i := 0; i < b.N; i++ { 64 lockFreeAccess() 65 } 66 } 67 68 func BenchmarkLock(b *testing.B) { 69 b.ResetTimer() 70 for i := 0; i < b.N; i++ { 71 lockAccess() 72 } 73 }