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

Can I use *sync.Mutex as an object specific variable?

我想让我的程序更有效率:
我可以给一个结构体一个 *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)
}

because whenever I set a Lock on any mutex all variables are Locked?

那没有任何意义。互斥量保持锁定状态。调用其 Lock()Unlock() 方法根据其状态同步 goroutine。单独的互斥值具有单独的、不同的状态。

将互斥量添加到结构中是完全正常且常见的,您甚至可以将其嵌入:效果如您所愿:互斥量可用于保护对包含结构的并发访问值,但其他结构值不受影响。 2 个并发的 goroutine 可能会更新 2 个独立的结构值,但不会有超过 1 个 goroutine 同时访问相同的结构值。