sync.Mutex

公平锁:

锁有两种模式:正常模式、饥饿模式

  1. 正常模式下,维护一个先进先出的goroutine的等待队列,并且唤醒的goroutine需要和新的goroutine一起竞争,容易发送锁饥饿。
  2. 饥饿模式下,锁的所有权从锁的释放直接给到等待队列的头部,不参与任何竞争。
  3. 正常模式性能比饥饿模式高,因为一个goroutine有多次机会触发获取锁;饥饿模式防止尾部延迟。
  4. 正常模式->饥饿模式条件:1:某个goroutine等待锁时间超过1ms。
  5. 饥饿模式->正常模式条件:1:它是等待队列的最后一个;2. 它拿到锁的时间小于1ms。
  6. mutexWaiterShift int32常量一直累加,代表等待gorountine的数量,超过类型进度,大概3亿个goroutine会溢出。
  7. 使用cas更新状态。

自旋拿锁:

  1. 饥饿模式不自旋。
  2. 加锁,并且符合能够自旋的逻辑。
  3. 先设置锁的状态和再修改自身的状态。
  4. 自旋的条件:1: 自旋的次数小于active_count=4,2: 当前允许环境是多核机器,3: 当前P没有等待任务;4. 存在另外运行的P。

解锁

  1. 锁和goroutine没有绑定关系,允许加锁和解锁的不再同一个goroutine。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值