1
0

spinlock_test.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package syncx
  2. import (
  3. "runtime"
  4. "sync"
  5. "sync/atomic"
  6. "testing"
  7. "time"
  8. "github.com/stretchr/testify/assert"
  9. "github.com/wuntsong-org/go-zero-plus/core/lang"
  10. )
  11. func TestTryLock(t *testing.T) {
  12. var lock SpinLock
  13. assert.True(t, lock.TryLock())
  14. assert.False(t, lock.TryLock())
  15. lock.Unlock()
  16. assert.True(t, lock.TryLock())
  17. }
  18. func TestSpinLock(t *testing.T) {
  19. var lock SpinLock
  20. lock.Lock()
  21. assert.False(t, lock.TryLock())
  22. lock.Unlock()
  23. assert.True(t, lock.TryLock())
  24. }
  25. func TestSpinLockRace(t *testing.T) {
  26. var lock SpinLock
  27. lock.Lock()
  28. var wait sync.WaitGroup
  29. wait.Add(1)
  30. go func() {
  31. wait.Done()
  32. }()
  33. time.Sleep(time.Millisecond * 100)
  34. lock.Unlock()
  35. wait.Wait()
  36. assert.True(t, lock.TryLock())
  37. }
  38. func TestSpinLock_TryLock(t *testing.T) {
  39. var lock SpinLock
  40. var count int32
  41. var wait sync.WaitGroup
  42. wait.Add(2)
  43. sig := make(chan lang.PlaceholderType)
  44. go func() {
  45. lock.TryLock()
  46. sig <- lang.Placeholder
  47. atomic.AddInt32(&count, 1)
  48. runtime.Gosched()
  49. lock.Unlock()
  50. wait.Done()
  51. }()
  52. go func() {
  53. <-sig
  54. lock.Lock()
  55. atomic.AddInt32(&count, 1)
  56. lock.Unlock()
  57. wait.Done()
  58. }()
  59. wait.Wait()
  60. assert.Equal(t, int32(2), atomic.LoadInt32(&count))
  61. }