nps源码阅读--自旋锁(Spinlock)
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 定义 自旋锁是计算机科学用于多线程同步的一种锁,线程反复检查锁变量是否可用。由于线程保持活动状态,但未执行其他的任务,因此是一种 繁忙等待(Busy waiting) 。一旦获取了自旋锁,线程会一直保持该锁,直至显式释放自旋锁。它避免了进程重新调度或上下文的切换带来的开销,因此对于线程只会阻塞很短时间的场合是有效的。 go源码 package internal import ( "runtime" "sync" "sync/atomic" ) type spinLock uint32 func (sl *spinLock) Lock() { for !atomic.CompareAndSwapUint32((*uint32)(sl), 0, 1) { //判断是否能获得锁 runtime.Gosched() //出让cpu } } func (sl *spinLock) Unlock() { atomic.StoreUint32((*uint32)(sl), 0) } // NewSpinLock 实例化自旋锁 func NewSpinLock() sync.Locker { return new(spinLock) } //代码来源 github.com/panjf2000/ants runtime