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  }