文档章节

sync 包讲解

李琼涛
 李琼涛
发布于 10/14 18:59
字数 955
阅读 18
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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.Mutex 互斥锁
李琼涛
粉丝 11
博文 142
码字总数 41493
作品 0
海淀
架构师
私信 提问
BitTorrent Sync使用方法

BitTorrent Sync是一个简单的文件传输工具,他使用p2p协议传输文件,以最大的安全度、网络带宽、存储能力传输文件。文件通过p2p协议传输,因此每一个链接上的电脑都同时是客户端和服务端。设...

China_OS
2014/02/22
19.8K
3
postgresql jdbc prepared 的通信过程的分析

通过postgresql的官方文档,可以了解到与prepared整个过程相关的包大概包含parse, bind, describe , execute ,sync,这5个包是从客户端向服务端发送的。当服务端处理完毕这些包后会返回对应的...

harris2016
2016/06/14
111
0
mysql5.5以上半同步讲解

1.半同步半同步复制是主库将binlog日志发给从库,并确认binlog写入从库的relay-log的日志中,这个时候才会返回给主库2.异步复制异步复制就是咱们平时说的主从复制,主库将binlog发给从库这个...

小小三郎1
2017/12/17
0
0
Netty解决粘包和拆包问题的四种方案

在RPC框架中,粘包和拆包问题是必须解决一个问题,因为RPC框架中,各个微服务相互之间都是维系了一个TCP长连接,比如dubbo就是一个全双工的长连接。由于微服务往对方发送信息的时候,所有的请...

爱宝贝丶
03/18
5.6K
15
TCP/IP 系列之 Header 篇

这是 TCP/IP 系列的第二篇,阅读目标是建立对网络包结构的初步认识。 上一篇里,我们提到一次完整的 TCP 会话其实是一个字节流,只不过我们可以按照一定的规则来切割这个字节流,从而划分出一...

MrPeak
2017/03/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

hbase错误记录

说什么服务没启动 但是 $ jps 查看又是正常的 然后想到去看日志 $ vim logs/hbase-root-regionserver-hadoop101.log INFO信息停留在:client.ZooKeeperRegistry: ClusterId read in ZooKeep...

天空飘来五个字儿
24分钟前
5
0
类的第一个元素的CSS选择器

我有一堆元素的类名是red ,但是我似乎无法使用以下CSS规则选择class="red"的第一个元素: .red:first-child { border: 5px solid red; } <p class="red"></p> <div class="red"></div> 该选......

技术盛宴
31分钟前
4
0
如何将重复数据突出显示?

将表格中一列数据中重复的,使用特殊颜色突出显示或者使用一些符号标记出来。 例如: 一个供应商,可以邀请别的供应商加入成为联合体,报表要显示所有供应商,然后供应商最后一列显示所有联合...

泡泡糖儿
33分钟前
4
0
python将html的百分号转为对应的编码

import redef trans(x): # print(x.group()) return bytes.fromhex(x.group()[2:].decode("utf-8"))data = str("你好".encode("utf-8"))print(data)data = re.subn(b"\\\\x[0-9......

鬼上身跳不过门槛
43分钟前
4
0
如何在nohup下放置已经运行的进程?

我有一个已经运行了很长时间并且不想结束它的进程。 我怎么把它放在nohup下(也就是说,即使关闭终端,如何让它继续运行?) #1楼 假设由于某种原因, Ctrl + Z也无法正常工作,转到另一个终...

javail
46分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部