local_test.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package lock
  2. import (
  3. "fmt"
  4. "sync"
  5. "testing"
  6. )
  7. func TestLocal_GetLock(t *testing.T) {
  8. l := NewLocal()
  9. wg := sync.WaitGroup{}
  10. wg.Add(3)
  11. var l1 *sync.Mutex
  12. var l2 *sync.Mutex
  13. var l3 *sync.Mutex
  14. i := 0
  15. go func() {
  16. l1 = l.GetLock("key")
  17. fmt.Println("l1", l1, i)
  18. l1.Lock()
  19. fmt.Println("l1", i)
  20. i++
  21. l1.Unlock()
  22. wg.Done()
  23. }()
  24. go func() {
  25. l2 = l.GetLock("key")
  26. fmt.Println("l2", l2, i)
  27. l2.Lock()
  28. fmt.Println("l2", i)
  29. i++
  30. l2.Unlock()
  31. wg.Done()
  32. }()
  33. go func() {
  34. l3 = l.GetLock("key")
  35. fmt.Println("l3", l3, i)
  36. l3.Lock()
  37. fmt.Println("l3", i)
  38. i++
  39. l3.Unlock()
  40. wg.Done()
  41. }()
  42. wg.Wait()
  43. fmt.Println(l1, l2, l3)
  44. fmt.Println(l1 == l2, l2 == l3)
  45. fmt.Println(&sync.Mutex{} == &sync.Mutex{})
  46. }
  47. func TestLocal_Lock(t *testing.T) {
  48. l := NewLocal()
  49. wg := sync.WaitGroup{}
  50. m := 10
  51. wg.Add(m)
  52. i := 0
  53. for j := 0; j < m; j++ {
  54. go func() {
  55. l.Lock("key")
  56. //fmt.Println(j, i)
  57. i++
  58. fmt.Println(j, i)
  59. l.UnLock("key")
  60. wg.Done()
  61. }()
  62. }
  63. wg.Wait()
  64. fmt.Println(i)
  65. }
  66. func TestSyncMap(t *testing.T) {
  67. m := sync.Map{}
  68. wg := sync.WaitGroup{}
  69. wg.Add(3)
  70. go func() {
  71. v, ok := m.LoadOrStore("key", 1)
  72. fmt.Println(1, v, ok)
  73. wg.Done()
  74. }()
  75. go func() {
  76. v, ok := m.LoadOrStore("key", 2)
  77. fmt.Println(2, v, ok)
  78. wg.Done()
  79. }()
  80. go func() {
  81. v, ok := m.LoadOrStore("key", 3)
  82. fmt.Println(3, v, ok)
  83. wg.Done()
  84. }()
  85. wg.Wait()
  86. }