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