【推荐】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。
来源:oschina
链接:https://my.oschina.net/lengan/blog/3141958