Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Golang 锁 #10

Open
AlexZ33 opened this issue May 26, 2021 · 0 comments
Open

Golang 锁 #10

AlexZ33 opened this issue May 26, 2021 · 0 comments

Comments

@AlexZ33
Copy link
Member

AlexZ33 commented May 26, 2021

golang 中的 sync 包实现了两种锁:

Mutex:互斥锁
RWMutex:读写锁,RWMutex 基于 Mutex 实现

Mutex(互斥锁)

  • Mutex 为互斥锁,Lock() 加锁,Unlock() 解锁
  • 在一个 goroutine 获得 Mutex 后,其他 goroutine 只能等到这个 goroutine 释放该 Mutex
  • 使用 Lock() 加锁后,不能再继续对其加锁,直到利用 Unlock() 解锁后才能再加锁
  • 在 Lock() 之前使用 Unlock() 会导致 panic 异常
  • 已经锁定的 Mutex 并不与特定的 goroutine 相关联,这样可以利用一个 goroutine 对其加锁,再利用其他 goroutine 对其解锁
  • 在同一个 goroutine 中的 Mutex 解锁之前再次进行加锁,会导致死锁
    适用于读写不确定,并且只有一个读或者写的场景

加锁解锁示例

  • sync.mutex 加锁后禁止其他地方读或写,这个适用于可能出现的在不同go程中修改同一个数据
  • sync.rwmutex 的lock 和 unlock 的使用和sync.mutex类似
  • sync.rwmutex 的rlock和runlock的使用适用于要读取数据,防止在读取的同时可能出现的别的地方写入 而导致的读取失败
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant