我可以使用 *sync.Mutex 作为对象特定变量吗?

我想让我的程序更高效:

我可以给*sync.Mutex一个结构变量一个变量,以便当我执行obj.Mutex.Lock()它时它只是锁定该特定对象上的 goroutines 操作?


例子:


package main


import (

    "fmt"

    "sync"

    "time"

)


type mystruct struct {

    Counter int

    Mutex   *sync.Mutex

}


func (obj *mystruct) incrementCount() {

    for i := 0; i < 1000; i++ {

        obj.Mutex.Lock()

        obj.Counter++

        time.Sleep(time.Microsecond)

        obj.Mutex.Unlock()

    }

    fmt.Println("incrementCount returns")

}


func funcNotSensibleToMutex() {

    n := 0

    for i := 0; i < 1000; i++ {

        n++

        time.Sleep(time.Microsecond)

    }

    fmt.Println("returns first since it's not affected by mutex")

}


func main() {

    a := &mystruct{0, &sync.Mutex{}}

    go a.incrementCount()

    go a.incrementCount()

    go funcNotSensibleToMutex()


    time.Sleep(time.Duration(5) * time.Second)

    fmt.Println("a counter", a.Counter)

}


慕丝7291255
浏览 119回答 1
1回答

繁华开满天机

因为每当我在任何互斥体上设置锁定时,所有变量都被锁定?那没有任何意义。互斥体保持锁定状态。调用它的Lock()和Unlock()方法会根据它的状态来同步 goroutines。单独的互斥量值具有单独的不同状态。将互斥锁添加到结构中是完全正常和常见的,您甚至可以将其嵌入:您何时将互斥锁嵌入到 Go 中的结构中?效果如您所愿:互斥锁可用于保护对包含结构值的并发访问,但不影响其他结构值。2 个并发的 goroutine 可能会更新 2 个单独的结构值,但不会超过 1 个 goroutine 会同时访问同一个结构值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go