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  }