温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

sync包的作用是什么

发布时间:2021-06-29 13:48:11 来源:亿速云 阅读:198 作者:chen 栏目:大数据

这篇文章主要介绍“sync包的作用是什么”,在日常操作中,相信很多人在sync包的作用是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”sync包的作用是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

sync.Once

Once 的作用是多次调用但只执行一次,Once 只有一个方法,Once.Do(),向 Do 传入一个函数,这个函数在第一次执行 Once.Do() 的时候会被调用,以后再执行 Once.Do() 将没有任何动作,即使传入了其它的函数,也不会被执行,如果要执行其它函数,需要重新创建一个 Once 对象。
Once 可以安全的在多个例程中并行使用。

type Once struct {     m    Mutex     done uint32 }
// 都次调用,近执行一次方法f func (o *Once) Do(f func())

sync.Mutex

互斥锁用来保证在任一时刻,只能有一个例程访问某对象。
Mutex 的初始值为解锁状态。
Mutex 通常作为其它结构体的匿名字段使用,使该结构体具有 Lock 和 Unlock 方法。
Mutex 可以安全的在多个例程中并行使用。

// Locker 接口包装了基本的 Lock 和 UnLock 方法,用于加锁和解锁。 type Locker interface {     Lock()     Unlock() }
// Lock 用于锁住 m,如果 m 已经被加锁,则 Lock 将被阻塞,直到 m 被解锁。 func (m *Mutex) Lock()
// Unlock 用于解锁 m,如果 m 未加锁,则该操作会引发 panic。 func (m *Mutex) Unlock()

sync.RWMutex

RWMutex 比 Mutex 多了一个“读锁定”和“读解锁”,可以让多个例程同时读取某对象。
RWMutex 的初始值为解锁状态。
RWMutex 通常作为其它结构体的匿名字段使用。
Mutex 可以安全的在多个例程中并行使用。

// Lock 将 rw 设置为写锁定状态,禁止其他例程读取或写入。 func (rw *RWMutex) Lock()
// Unlock 解除 rw 的写锁定状态,如果 rw 未被写锁定,则该操作会引发 panic。 func (rw *RWMutex) Unlock()
// RLock 将 rw 设置为读锁定状态,禁止其他例程写入,但可以读取。 func (rw *RWMutex) RLock()
// Runlock 解除 rw 的读锁定状态,如果 rw 未被读锁顶,则该操作会引发 panic。 func (rw *RWMutex) RUnlock()
// RLocker 返回一个互斥锁,将 rw.RLock 和 rw.RUnlock 封装成了一个 Locker 接口。 func (rw *RWMutex) RLocker() Locker

sync.WaitGroup

WaitGroup 用于等待一组例程的结束。
主例程在创建每个子例程的时候先调用 Add 增加等待计数,每个子例程在结束时调用 Done 减少例程计数。
之后,主例程通过 Wait 方法开始等待,直到计数器归零才继续执行。 

// 计数器增加 delta,delta 可以是负数。 func (wg *WaitGroup) Add(delta int)
// 计数器减少 1 func (wg *WaitGroup) Done()
// 等待直到计数器归零。如果计数器小于 0,则该操作会引发 panic。 func (wg *WaitGroup) Wait()

sync.Cron

条件等待通过 Wait 让例程等待,通过 Signal 让一个等待的例程继续,通过 Broadcast 让所有等待的例程继续。
在 Wait 之前应当手动为 c.L 上锁,Wait 结束后手动解锁。为避免虚假唤醒,需要将 Wait 放到一个条件判断循环中

官方要求的写法如下:

c.L.Lock() for !condition() {     c.Wait() } // 执行条件满足之后的动作... c.L.Unlock()
type Cond struct {     L Locker // 在“检查条件”或“更改条件”时 L 应该锁定。 } 
// 创建一个条件等待 func NewCond(l Locker) *Cond
// Broadcast 唤醒所有等待的 Wait,建议在“更改条件”时锁定 c.L,更改完毕再解锁。 func (c *Cond) Broadcast()
// Signal 唤醒一个等待的 Wait,建议在“更改条件”时锁定 c.L,更改完毕再解锁。 func (c *Cond) Signal()
// Wait 会解锁 c.L 并进入等待状态,在被唤醒时,会重新锁定 c.L func (c *Cond) Wait()

到此,关于“sync包的作用是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI