日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)GoFrame教程:GoFrame 互斥鎖-gmutex

?gmutex?模塊是基于?atomic ?+ ?channel?實(shí)現(xiàn)的高級互斥鎖模塊,支持更豐富的互斥鎖特性。

創(chuàng)新互聯(lián)主要從事網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)臨潼,十多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792

?gmutex.Mutex?互斥鎖對象支持讀寫控制,互斥鎖功能邏輯與標(biāo)準(zhǔn)庫?sync.RWMutex?類似,可并發(fā)讀但不可并發(fā)寫。

互斥鎖的設(shè)計(jì)細(xì)節(jié),推薦閱讀輕量級高清版的實(shí)現(xiàn)源碼:https://github.com/GOgf/gf/v2/blob/master/os/gmutex/gmutex.go

使用方式:

import "github.com/gogf/gf/v2/os/gmutex"

接口文檔:

https://pkg.go.dev/github.com/gogf/gf/v2/os/gmutex

type Mutex
    func New() *Mutex
    func (m *Mutex) IsLocked() bool
    func (m *Mutex) IsRLocked() bool
    func (m *Mutex) IsWLocked() bool
    func (m *Mutex) Lock()
    func (m *Mutex) LockFunc(f func())
    func (m *Mutex) RLock()
    func (m *Mutex) RLockFunc(f func())
    func (m *Mutex) RUnlock()
    func (m *Mutex) TryLock() bool
    func (m *Mutex) TryLockFunc(f func()) bool
    func (m *Mutex) TryRLock() bool
    func (m *Mutex) TryRLockFunc(f func()) bool
    func (m *Mutex) Unlock()

  1. 該互斥鎖模塊最大的特點(diǎn)是支持?Try*?方法以及?*Func?方法。
  2. ?Try*?方法用于實(shí)現(xiàn)嘗試獲得特定類型的鎖,如果獲得鎖成功則立即返回?true?,否則立即返回?false?,不會(huì)阻塞等待,這對于需要使用非阻塞鎖機(jī)制的業(yè)務(wù)邏輯非常實(shí)用。
  3. ?*Func?方法使用閉包匿名函數(shù)的方式實(shí)現(xiàn)特定作用域的并發(fā)安全鎖控制,這對于特定代碼塊的并發(fā)安全控制特別方便,由于內(nèi)部使用了?defer?來釋放鎖,因此即使函數(shù)內(nèi)部產(chǎn)生異常錯(cuò)誤,也不會(huì)影響鎖機(jī)制的安全性控制。

示例1,基本使用

package main

import (
    "time"

    "github.com/gogf/gf/v2/os/glog"
    "github.com/gogf/gf/v2/os/gmutex"
)

func main() {
    mu := gmutex.New()
    for i := 0; i < 10; i++ {
        go func(n int) {
            mu.Lock()
            defer mu.Unlock()
            glog.Println("Lock:", n)
            time.Sleep(time.Second)
        }(i)
    }
    for i := 0; i < 10; i++ {
        go func(n int) {
            mu.RLock()
            defer mu.RUnlock()
            glog.Println("RLock:", n)
            time.Sleep(time.Second)
        }(i)
    }
    time.Sleep(11 * time.Second)
}

執(zhí)行后,終端輸出:

2019-07-13 16:19:55.417 Lock: 0
2019-07-13 16:19:56.421 Lock: 1
2019-07-13 16:19:57.424 RLock: 0
2019-07-13 16:19:57.424 RLock: 4
2019-07-13 16:19:57.425 RLock: 8
2019-07-13 16:19:57.425 RLock: 2
2019-07-13 16:19:57.425 RLock: 7
2019-07-13 16:19:57.425 RLock: 5
2019-07-13 16:19:57.425 RLock: 9
2019-07-13 16:19:57.425 RLock: 1
2019-07-13 16:19:57.425 RLock: 6
2019-07-13 16:19:57.425 RLock: 3
2019-07-13 16:19:58.429 Lock: 3
2019-07-13 16:19:59.433 Lock: 4
2019-07-13 16:20:00.438 Lock: 5
2019-07-13 16:20:01.443 Lock: 6
2019-07-13 16:20:02.448 Lock: 7
2019-07-13 16:20:03.452 Lock: 8
2019-07-13 16:20:04.456 Lock: 9
2019-07-13 16:20:05.461 Lock: 2

這里使用?glog?打印的目的,是可以方便地看到打印輸出的時(shí)間??梢钥吹?,在第3秒的時(shí)候,讀鎖搶占到了機(jī)會(huì),由于?gmutex.Mutex?對象支持并發(fā)讀但不支持并發(fā)寫,因此讀鎖搶占后迅速執(zhí)行完畢;而寫鎖依舊保持每秒打印一條日志繼續(xù)執(zhí)行。

示例2,*Func使用

package main

import (
    "time"

    "github.com/gogf/gf/v2/os/glog"

    "github.com/gogf/gf/v2/os/gmutex"
)

func main() {
    mu := gmutex.New()
    go mu.LockFunc(func() {
        glog.Println("lock func1")
        time.Sleep(1 * time.Second)
    })
    time.Sleep(time.Millisecond)
    go mu.LockFunc(func() {
        glog.Println("lock func2")
    })
    time.Sleep(2 * time.Second)
}

執(zhí)行后,終端輸出:

2019-07-13 16:28:10.381 lock func1
2019-07-13 16:28:11.385 lock func2

可以看到,使用?*Func?方法實(shí)現(xiàn)特定作用域的鎖控制非常方便。


網(wǎng)頁名稱:創(chuàng)新互聯(lián)GoFrame教程:GoFrame 互斥鎖-gmutex
文章源于:http://www.5511xx.com/article/cdpjjgh.html