2017-01-03 89 views
1

对于互斥锁在Golang中的工作方式,我有点困惑,尽管我之前使用过它们。Golang互斥锁锁定特定变量/地图

这里是我的问题:

  1. 究竟做了互斥锁? (How)你只用它来锁定一个特定的变量吗?

  2. 我应该使用频道而不是互斥吗?

  3. 互斥体和储物柜之间有区别吗?

我发展与golang高并发网站,我需要在不同的时间来管理每个人的钱包,我试图避免在我的程序中的任何比赛。例如,如果我的程序想要向用户添加500个积分,它将从用户(从Firebase)读取当前余额并添加500,然后更新该值。但如果由于某种原因这样做了两次,用户的钱包可能会发生不正确的变化。

回答

5

什么是互斥锁?

通常,“互斥”构造(或互斥体)有助于并发控制。定义互斥体的语言让程序员定义了只能由单个执行线程输入的关键代码段。 Here is a simple example of using mutexes in GoHere is a bit more detailed example of using mutexes

互斥锁或通道?

当决定是否在Go应用程序中使用互斥或​​基于频道的设计时,选项并不总是非常清晰。这wiki article from the Go github repo有以下建议:

频道:数据的传递所有权, 分发工作的单位, 交流异步结果

互斥:高速缓存,状态

互斥或同步。洛克?

As @JimB指出,Go中的sync.Mutex类型满足sync.Locker接口类型。请注意0​​有Lock()Unlock()方法吗?所以去,sync.Mutexsync.Locker

欲了解更多help with Go interfaces, check out this great blog post

1
  1. A Mutex只锁定自己。您需要决定该锁代表您的代码中的内容。
  2. 使用通道在goroutines之间进行同步和通信。使用互斥锁在单个逻辑资源周围提供“互斥”。
  3. 互斥体满足sync.Locker接口。需要sync.Locker的东西可以互换使用sync.Mutexsync.RWMutex

同步原语与防止重复事务的概念无关。正确使用同步只会阻止程序中的数据竞争。

+0

我在godoc上读到一个互斥体满足sync.Locker接口,但并不真正理解它的含义。我正在寻找一个探索。另外,我将如何使用互斥体锁定一个特定的变量? (这取决于你决定什么意思?) – Acidic

+1

@Acidic:[“Interfaces”](https://golang.org/ref/spec#Interface_types)是一个主要的Go概念,您需要了解如何使用该语言。也许从官方文档开始,比如[Effective Go](https://golang.org/doc/effective_go.html#interfaces)中的相应部分,或者[Go of Tour](https://tour.golang。组织/方法/ 9)。除了在代码中使用它之外,互斥锁与锁之间没有任何关系。 – JimB

0

如果状态不在内存中。你真的不需要同步锁。但是,让我们说所有的用户钱包都在一个地图内。您将需要一个,因为并发写入将导致竞争条件。