go锁-互斥锁
sema初始值是0,waitershift等待协程的数量
正常枷锁:
尝试CAS直接加锁,通过原子包给lockerd 为枷锁
若无法直接获取,进行多次自旋尝试,未获取到的锁的g ,多次执行空语句,多次尝试获取锁
多次尝试失败,sema为0获取不到,进入sema队列休眠,等待个数加1
正常模式解锁
解锁后,检查有没有协程在等待,会唤醒一个协程,拿出一个协程放到调度器里面运行,被拿出的协程不能直接获得锁,还有其他协程在竞争锁
锁饥饿
当前协程等待锁的时间超过了1ms,切换到饥饿模式
饥饿模式中,不自旋,新来的协程直接sema休眠
饥饿模式中,被唤醒的协程直接获取锁
没有协程在队列中继续等待时,回到正常模式