nps源码阅读--自旋锁(Spinlock)

倾然丶 夕夏残阳落幕 提交于 2019-12-11 23:27:47

【推荐】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.Gosched()

这个函数的作用是让当前goroutine让出CPU,好让其它的goroutine获得执行的机会。同时,当前的goroutine也会在未来的某个时间点继续运行。

当多个goroutine同时执行时,只能有持有lock的goroutine的执行,其他都是出cpu等待,当显式调用unlock时才能交由下一个获得锁的goroutine。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!