• 81890

    文章

  • 734

    评论

  • 18

    友链

  • 最近新加了换肤功能,大家多来逛逛吧~~~~
  • 喜欢这个网站的朋友可以加一下QQ群,我们一起交流技术。

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

撸了今年阿里、腾讯和美团的面试,我有一个重要发现.......>>

定义

自旋锁是计算机科学用于多线程同步的一种锁,线程反复检查锁变量是否可用。由于线程保持活动状态,但未执行其他的任务,因此是一种繁忙等待(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。


695856371Web网页设计师②群 | 喜欢本站的朋友可以收藏本站,或者加入我们大家一起来交流技术!

欢迎来到梁钟霖个人博客网站。本个人博客网站提供最新的站长新闻,各种互联网资讯。 还提供个人博客模板,最新最全的java教程,java面试题。在此我将尽我最大所能将此个人博客网站做的最好! 谢谢大家,愿大家一起进步!

转载原创文章请注明出处,转载至: 梁钟霖个人博客www.liangzl.com

0条评论

Loading...


发表评论

电子邮件地址不会被公开。 必填项已用*标注

自定义皮肤
注册梁钟霖个人博客