local_test.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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. wg.Add(3)
  51. i := 0
  52. go func() {
  53. l.Lock("key")
  54. fmt.Println("l1", i)
  55. i++
  56. l.UnLock("key")
  57. wg.Done()
  58. }()
  59. go func() {
  60. l.Lock("key")
  61. fmt.Println("l2", i)
  62. i++
  63. l.UnLock("key")
  64. wg.Done()
  65. }()
  66. go func() {
  67. l.Lock("key")
  68. fmt.Println("l3", i)
  69. i++
  70. l.UnLock("key")
  71. wg.Done()
  72. }()
  73. wg.Wait()
  74. }
  75. func TestSyncMap(t *testing.T) {
  76. m := sync.Map{}
  77. wg := sync.WaitGroup{}
  78. wg.Add(3)
  79. go func() {
  80. v, ok := m.LoadOrStore("key", 1)
  81. fmt.Println(1, v, ok)
  82. wg.Done()
  83. }()
  84. go func() {
  85. v, ok := m.LoadOrStore("key", 2)
  86. fmt.Println(2, v, ok)
  87. wg.Done()
  88. }()
  89. go func() {
  90. v, ok := m.LoadOrStore("key", 3)
  91. fmt.Println(3, v, ok)
  92. wg.Done()
  93. }()
  94. wg.Wait()
  95. }