😥 整理不易,此资源只针对正式星主开放,
还请入驻星球后再来观看。

GOLANG ROADMAP

阅读模式

  • 沉浸
  • 自动
  • 日常
首页
Go学习
  • Go学院

    • Go小课
    • Go视界
    • Go小考
    • Go实战
  • Go资源

    • 优质课程
    • 在线宝典
    • 资源下载
    • 帮找资源
训练营 🔥
  • Go体系课&实战训练营
  • 升值加薪陪跑训练营
Go求职
  • 求职刷题

    • 企业题库
    • 面试宝典
    • 求职面经
  • 求职服务

    • 内推互助
    • 求职助力
    • 内推公司
Go友会
  • 城市
  • 校园
推广返佣
  • 返佣排行
  • 返佣规则
  • 推广学院
实验区
  • Go周边
  • Go宝典

    • 推荐图书
    • 精品博文
  • Go开源

    • Go仓库
    • Go月刊
更多
  • 用户中心

    • 我的信息
    • 我的返佣
    • 我的消息
  • 玩转星球

    • 星球介绍
    • 星主权益
    • 吐槽专区
    • 成长记录
  • 合作交流

    • 商务合作
    • 讲师招募
    • 生态伙伴
author-avatar

GOLANG ROADMAP


首页
Go学习
  • Go学院

    • Go小课
    • Go视界
    • Go小考
    • Go实战
  • Go资源

    • 优质课程
    • 在线宝典
    • 资源下载
    • 帮找资源
训练营 🔥
  • Go体系课&实战训练营
  • 升值加薪陪跑训练营
Go求职
  • 求职刷题

    • 企业题库
    • 面试宝典
    • 求职面经
  • 求职服务

    • 内推互助
    • 求职助力
    • 内推公司
Go友会
  • 城市
  • 校园
推广返佣
  • 返佣排行
  • 返佣规则
  • 推广学院
实验区
  • Go周边
  • Go宝典

    • 推荐图书
    • 精品博文
  • Go开源

    • Go仓库
    • Go月刊
更多
  • 用户中心

    • 我的信息
    • 我的返佣
    • 我的消息
  • 玩转星球

    • 星球介绍
    • 星主权益
    • 吐槽专区
    • 成长记录
  • 合作交流

    • 商务合作
    • 讲师招募
    • 生态伙伴
  • Go真实面试题汇总系列

    • Go基础篇
  • 宝典内容

    • 2. 对已经关闭的channel进行读写操作会发生什么?
    • 7.介绍一下通道
    • 8.channel实现方式/原理/概念/底层实现
    • 9. 同一个协程里面,对无缓冲channel同时发送和接收数据有什么问题
    • 10.channel和锁的对比
    • 11. channel的应用场景
    • 14. 向为nil的channel发送数据会怎么样
    • 28. channel有缓冲和无缓冲在使用上有什么区别?
    • 47. 管道是否能二次关闭?
    • 48. 管道关闭是否能读写?
    • 52. channel是否线程安全等;
    • 91. go利用channel通信的方式
    • 103. 被close的channel会有什么问题
    • 104. 分布式锁知道哪些?用channel如何实现?
    • 105. 集群用channel如何实现分布式锁
    • 118. Channel 的使用场景
    • 149. gochannel实现排序
    • 189. go 里的 syncLock 和 channel 的性能有区别吗?
    • 209. 了解过channel吗?
    • 210. channel内部数据结构有了解吗?
    • 216. 介绍下go的chan,chan可以做什么
    • 217. 如何实现限流器,请用chan实现一种限流器,也可以不用chan实现
    • 260. 如何判断channel已关闭?
    • 273. channel关闭以后,再往其发送或接收,会发生什么
    • 307. go channel底层实现
    • 331. 说说你了解的管道
    • 332. 看过管道的底层源码吗
    • 346. 实现chan struct{}不占用内存空间,实现传递信号的通道
    • 364. channel有了解吗?
    • 382. golang的管道怎么用;我说是channel
    • 390. channel和锁对比一下
    • 391. channel的应用场景
    • 395. chan的阻塞和非阻塞?
    • 405. channel怎么实现线程安全
    • 412. channelnobuffer以及buffer的区别。
    • 425. channel 底层
    • 426. sync包中的同步原语和channel的使用场景
    • 436. channel和共享内存有什么优劣势?

😥 整理不易,此资源只针对正式星主开放,
还请入驻星球后再来观看。

426. sync包中的同步原语和channel的使用场景


企业题库解析小组

题目来源:七牛

参考《GO 语言并发之道》

参考 http://www.zzvips.com/article/183814.html

Go 语言中的channel和临界区都是控制并发的一种手段,谈及并发,谈及并发,我们首先要了解竞争条件:

当两个或多个操作必须按正确的顺序执行,而程序并未保证这个顺序,就会发生竞争条件。大多数情况下,这将在所谓的数据中出现,其中一个并发操作尝试读取一个变量,而在某个不确定的时间,另一个并发操作试图写入同一个变量。

那什么是临界区呢?

程序中需要独占访问共享资源的部分就叫临界区。举个例子

var data int
go func(){
	data++
}()
if data == 0{
	fmt.Println("the value is 0.")
}else{
	fmt.Printf("the value is %v.\n",data)
}
1
2
3
4
5
6
7
8
9

在这个例子中我们有三个临界区

  • goroutine正在使数据变量递增
  • if 语句,他检查数据的值是否为0
  • fmt.Printf语句,在检索并打印变量的值。

如何解决因为多个goroutine在同一地址空间上运行而产生的数据竞争问题:那就引入了我们的主角,1. 通过sync包的同步原语访问共享内存 2 使用CSP原语来通信共享内存。

sync包含的对低级别内存访问同步最有用的并发原语:

  • WaitGroup(等待一组并发操作完成的方法,尚硅谷有视频称“集齐七颗龙珠召唤神龙”非常形象,可以想象它是一组并发安全的计数器)
  • 互斥锁和读写锁
  • Cond (一般可以认为是事件触发变量,提供signal 和 broadcast 两种方法,当达到某个条件的时候,触发唤醒单个或所有阻塞的goroutine)
  • Once(确保即使在不同的goroutine上,也只会调用一次Do方法处理的函数)

Go重要的主角channel使用的场景

  • 使用chan struct{}作为信号channel
  • 管道实现互斥锁(利用无缓冲通道的同步性质)
  • 使用channel控制子协程( 父协程可以等待子协程结束,父协程也可以向管道中写入数据通知子协程结束,这时子协程需要定期地探测管道中是否有消息出现。)

注意: 使用channel来控制子协程的优点是实现简单,缺点是当需要大量创建协程时就需要有相同数量的channel,而且对于子协程继续派生出来的协程不方便控制。