我对有关互斥锁在Golang中的工作方式感到有些困惑,尽管我之前已经使用过它们。
以下是我的问题:
互斥锁到底是什么锁定的? (如何)您是否仅使用它来锁定特定变量?
我应该使用频道而不是互斥吗?
互斥锁和储物柜之间有区别吗?
我正在使用golang开发一个高度并发的网站,我需要在不同的时间管理每个人的钱包,我试图避免我的程序中的任何比赛。例如,如果我的程序想要向用户添加500个信用,它将读取用户的当前余额(来自firebase)并添加500然后更新该值。但如果出于某种原因这样做了两次,那么用户的钱包可能会有不正确的更改。
答案 0 :(得分:5)
什么是Mutex?
通常,“互斥”构造(或互斥)有助于并发控制。定义互斥体的语言允许程序员定义一个只能由单个执行线程输入的关键代码段。 Here is a simple example of using mutexes in Go。 Here is a bit more detailed example of using mutexes
Mutex或频道?
在Go应用程序中决定是否使用互斥或基于通道的设计时,选择并不总是非常清楚。这个wiki article from the Go github repo 有以下建议:
频道:传递数据所有权, 分配工作单位, 沟通异步结果
Mutex :缓存,状态
Mutex或sync.Locker?
正如@JimB所指出的,Go中的sync.Mutex
类型满足sync.Locker
接口类型。请注意sync.Mutex
如何使用Lock()
和Unlock()
方法?因此,对于Go,sync.Mutex
是sync.Locker
。
了解更多help with Go interfaces, check out this great blog post。
答案 1 :(得分:1)
Mutex
仅锁定自己。由您来决定代码中的锁定意味着什么。sync.Locker
接口。需要sync.Locker
的内容可以互换使用sync.Mutex
或sync.RWMutex
。 同步原语与防止重复事务的概念无关。正确使用同步只会阻止程序中的数据争用。
答案 2 :(得分:0)
如果状态不在内存中。你真的不需要同步锁。但是,假设所有用户钱包都在一张地图内。您需要一个,因为并发写入将导致竞争条件。