怎麼實現tryLock(timeout int)的功能
這是我自己嘗試寫的一個
package internal_struct
import (
"sync/atomic"
"time"
)
type MutexLock struct {
i *int32
}
func NewMutexLock() *MutexLock {
var i int32
i = 0
return &MutexLock{&i}
}
func (m *MutexLock) TryLock(timeout int) bool {
t := timeout
b := false
for !b {
b = atomic.CompareAndSwapInt32(m.i, 0, 1)
if b {
break
}
t--
if t == 0 {
break
}
time.Sleep(time.Millisecond)
}
return b
}
func (m *MutexLock) UnLock() {
atomic.CompareAndSwapInt32(m.i, 1, 0)
}
測試程式碼
package internal_struct
import (
"sync/atomic"
"testing"
"time"
)
func TestMutexLock_TryLock(t *testing.T) {
mutex := NewMutexLock()
t.Log(mutex.TryLock(1))
t.Log(mutex.TryLock(1))
mutex.UnLock()
t.Log(mutex.TryLock(1))
}
func TestMutexLock_UnLock(t *testing.T) {
mutex := NewMutexLock()
t.Log(mutex.TryLock(1))
mutex.UnLock()
t.Log(mutex.TryLock(1))
}
func TestMutexLock_TryLock2(t *testing.T) {
mutex := NewMutexLock()
var tid int32 = 0
i := 0
for ; i <= 20; i++ {
go func() {
id := atomic.AddInt32(&tid, 1)
f := mutex.TryLock(20)
t.Log(id, "【", time.Now(), "】", "-->", f)
time.Sleep(500*time.Millisecond)
if f {
t.Log(id, "【", time.Now(), "】", "-->unlock")
mutex.UnLock()
}
}()
time.Sleep(time.Millisecond * 50)
}
time.Sleep(10 * time.Second)
}
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- python的int怎麼用Python
- 網站裡的教程怎麼實現不了功能!網站
- 怎麼實現像這樣草稿功能
- 新增使用者的發帖功能怎麼實現
- 線上人數統計功能怎麼實現?
- 直播美顏SDK祛痘功能是怎麼實現的?
- 請教網站導航條的功能怎麼實現網站
- 直播美顏SDK中的美白功能是怎麼實現的?
- 短影片美顏SDK的抖動功能是怎麼實現的
- 影片美顏SDK的AI磨皮功能是怎麼實現的?AI
- JS實現非同步timeoutJS非同步
- 怎麼使用 pyqt5 的 textEdit 控制元件,實現拖拽功能?QT控制元件
- 短影片美顏SDK裡的祛痘功能是怎麼實現的?
- 請教一個timeout的實現問題
- 微信直播是怎麼實現的?
- Go 中的 channel 怎麼實現的?Go
- 第三方直播美顏SDK的美顏功能是怎麼實現的?
- 直播中常用的美顏sdk動態貼紙功能是什麼?技術怎麼實現的?
- 美顏SDK中的美顏功能是怎麼實現的?美顏SDK的工作原理是什麼?
- MySQL:引數wait_timeout和interactive_timeout以及空閒超時的實現MySqlAI
- v-model 是怎麼實現的?
- synchronized底層是怎麼實現的?synchronized
- BIOS INT 10中斷功能iOS
- 怎麼實現微服務的實時效能分析?微服務
- JVM的ServerSocket是怎麼實現的(上)JVMServer
- JVM的ServerSocket是怎麼實現的(下)JVMServer
- MySQL:網路斷開後執行的事務怎麼處理(read_timeout/write_timeout))MySql
- (int)a、&a、(int)&a、(int&)a的區別
- 怎麼實現谷歌登入?谷歌
- 怎麼實現深拷貝
- web 端怎麼實現套打發票、快遞單等套打功能?Web
- 今日頭條極速版邀請碼是多少?功能是怎麼實現?
- int[] 、 list<int> 、 list<int>[] 的區別
- 和 koa 不同的 express 是怎麼實現Express
- Fish Redux中的Dispatch是怎麼實現的?Redux
- 面試題:promise的鏈式怎麼實現的面試題Promise
- Angular 的依賴注入是怎麼實現的?Angular依賴注入
- 分頁功能的實現