我可以使用 *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 同时访问相同的结构值。
我想让我的程序更有效率:
我可以给一个结构体一个 *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。单独的互斥值具有单独的、不同的状态。
将互斥量添加到结构中是完全正常且常见的,您甚至可以将其嵌入: