Skip to content

Golang 锁 #10

Description

@AlexZ33

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的使用适用于要读取数据,防止在读取的同时可能出现的别的地方写入 而导致的读取失败

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions