Golang Mutex 锁定特定 Variable/Map
Golang Mutex to Lock Specific Variable/Map
我对互斥量在 Golang 中的工作方式有点困惑,尽管我以前使用过它们。
这是我的问题:
互斥锁到底是做什么的? (How) 你是不是只用它来锁定一个特定的变量?
我应该使用通道而不是互斥体吗?
mutex和locker有区别吗?
我正在用 golang 开发一个高度并发的网站,我需要在不同的时间管理每个人的钱包,我试图避免在我的程序中出现任何竞争。例如,如果我的程序想要向用户添加 500 个积分,它将读取用户的当前余额(来自 firebase)并添加 500,然后更新值。但如果由于某种原因它执行了两次,则可能是用户钱包的更改不正确。
- A
Mutex
只锁定自己。由您决定该锁在代码中的含义。
- 使用通道在 goroutine 之间进行同步和通信。使用互斥锁围绕单个逻辑资源提供 "mutual exclusion"。
- 互斥体满足
sync.Locker
接口。需要 sync.Locker
的内容可以交替使用 sync.Mutex
或 sync.RWMutex
。
同步原语与防止重复事务的概念无关。正确使用同步只会防止程序中的数据竞争。
什么是互斥量?
通常,"mutual exclusion" 构造(或互斥体)有助于并发控制。定义互斥锁的语言允许程序员定义只能由单个执行线程输入的代码的关键部分。 Here is a simple example of using mutexes in Go. Here is a bit more detailed example of using mutexes.
互斥锁还是通道?
在决定是在您的 Go 应用程序中使用基于互斥锁还是基于通道的设计时,选择并不总是非常明确。 wiki article from the Go github repo 有以下建议:
Channel:传递数据的所有权,
分配工作单位,
传达异步结果
Mutex:缓存,状态
互斥或sync.Locker?
正如@JimB 指出的那样,sync.Mutex
type in Go satisfies the sync.Locker
接口类型。注意到 sync.Mutex
有 Lock()
和 Unlock()
方法了吗?所以对于围棋来说,sync.Mutex
就是 sync.Locker
。
如果状态不在内存中。你真的不需要同步锁。但是假设所有用户的钱包都在一个地图中。您将需要一个,因为并发写入会导致竞争条件。
我对互斥量在 Golang 中的工作方式有点困惑,尽管我以前使用过它们。
这是我的问题:
互斥锁到底是做什么的? (How) 你是不是只用它来锁定一个特定的变量?
我应该使用通道而不是互斥体吗?
mutex和locker有区别吗?
我正在用 golang 开发一个高度并发的网站,我需要在不同的时间管理每个人的钱包,我试图避免在我的程序中出现任何竞争。例如,如果我的程序想要向用户添加 500 个积分,它将读取用户的当前余额(来自 firebase)并添加 500,然后更新值。但如果由于某种原因它执行了两次,则可能是用户钱包的更改不正确。
- A
Mutex
只锁定自己。由您决定该锁在代码中的含义。 - 使用通道在 goroutine 之间进行同步和通信。使用互斥锁围绕单个逻辑资源提供 "mutual exclusion"。
- 互斥体满足
sync.Locker
接口。需要sync.Locker
的内容可以交替使用sync.Mutex
或sync.RWMutex
。
同步原语与防止重复事务的概念无关。正确使用同步只会防止程序中的数据竞争。
什么是互斥量?
通常,"mutual exclusion" 构造(或互斥体)有助于并发控制。定义互斥锁的语言允许程序员定义只能由单个执行线程输入的代码的关键部分。 Here is a simple example of using mutexes in Go. Here is a bit more detailed example of using mutexes.
互斥锁还是通道?
在决定是在您的 Go 应用程序中使用基于互斥锁还是基于通道的设计时,选择并不总是非常明确。 wiki article from the Go github repo 有以下建议:
Channel:传递数据的所有权, 分配工作单位, 传达异步结果
Mutex:缓存,状态
互斥或sync.Locker?
正如@JimB 指出的那样,sync.Mutex
type in Go satisfies the sync.Locker
接口类型。注意到 sync.Mutex
有 Lock()
和 Unlock()
方法了吗?所以对于围棋来说,sync.Mutex
就是 sync.Locker
。
如果状态不在内存中。你真的不需要同步锁。但是假设所有用户的钱包都在一个地图中。您将需要一个,因为并发写入会导致竞争条件。