golang sync.Mutex的实现原理是怎样的?

2026-05-19 19:200阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计7291个文字,预计阅读时间需要30分钟。

golang sync.Mutex的实现原理是怎样的?

“实现mutex的思想主要包括两个方法:Lock() 和 Unlock()。Lock()可以通过一个CAS操作来实现。具体实现如下:

gofunc (m *Mutex) Lock() { for !atomic.CompareAndSwapUint32(&m.locked, 0, 1) { }}

func (m *Mutex) Unlock() { atomic.StoreUint32(&m.locked, 0)}

mutex 的实现思想

mutex 主要有两个 method: Lock()Unlock()

Lock() 可以通过一个 CAS 操作来实现

func (m *Mutex) Lock() { for !atomic.CompareAndSwapUint32(&m.locked, 0, 1) { } } func (m *Mutex) Unlock() { atomic.StoreUint32(&m.locked, 0) }

Lock() 一直进行 CAS 操作,比较耗 CPU。因此带来了一个优化:如果协程在一段时间内抢不到锁,可以把该协程挂到一个等待队列上,Unlock() 的一方除了更新锁的状态,还需要从等待队列中唤醒一个协程。

但是这个优化会存在一个问题,如果一个协程从等待队列中唤醒后再次抢锁时,锁已经被一个新来的协程抢走了,它就只能再次被挂到等待队列中,接着再被唤醒,但又可能抢锁失败...... 这个悲催的协程可能会一直抢不到锁,由此产生饥饿 (starvation) 现象。

阅读全文
标签:实现Mutex

本文共计7291个文字,预计阅读时间需要30分钟。

golang sync.Mutex的实现原理是怎样的?

“实现mutex的思想主要包括两个方法:Lock() 和 Unlock()。Lock()可以通过一个CAS操作来实现。具体实现如下:

gofunc (m *Mutex) Lock() { for !atomic.CompareAndSwapUint32(&m.locked, 0, 1) { }}

func (m *Mutex) Unlock() { atomic.StoreUint32(&m.locked, 0)}

mutex 的实现思想

mutex 主要有两个 method: Lock()Unlock()

Lock() 可以通过一个 CAS 操作来实现

func (m *Mutex) Lock() { for !atomic.CompareAndSwapUint32(&m.locked, 0, 1) { } } func (m *Mutex) Unlock() { atomic.StoreUint32(&m.locked, 0) }

Lock() 一直进行 CAS 操作,比较耗 CPU。因此带来了一个优化:如果协程在一段时间内抢不到锁,可以把该协程挂到一个等待队列上,Unlock() 的一方除了更新锁的状态,还需要从等待队列中唤醒一个协程。

但是这个优化会存在一个问题,如果一个协程从等待队列中唤醒后再次抢锁时,锁已经被一个新来的协程抢走了,它就只能再次被挂到等待队列中,接着再被唤醒,但又可能抢锁失败...... 这个悲催的协程可能会一直抢不到锁,由此产生饥饿 (starvation) 现象。

阅读全文
标签:实现Mutex