1、无缓冲的channel:无缓冲的channel只能发送完之后协程立马阻塞,只有等有协程接受了之后才能继续发送,等待协程接受了,之后立马阻塞,等待channel中有数据才会启动
package mainimport ("fmt""time"
)/*
无缓冲的channel只能发送完之后协程立马阻塞,只有等有协程接受了之后才能继续发送,
等待协程接受了,之后立马阻塞,等待channel中有数据才会启动
*/
func main() {c := make(chan int) //声明一个int类型的无缓冲通道go func() {fmt.Println("准备发送1数据")c <- 1fmt.Println("发送1数据完毕")fmt.Println("协程开始睡眠1秒")time.Sleep(time.Second)fmt.Println("协程结束睡眠")c <- 2fmt.Println("发送2数据完毕")}()fmt.Println("主线程休眠1秒")time.Sleep(time.Second)fmt.Println("主线程结束休眠")i := <-cfmt.Printf("接受 %d\n", i)i = <-cfmt.Printf("接受 %d\n", i)time.Sleep(time.Second)
}

2、有缓冲的channel:当缓冲区满了发送线程阻塞,缓冲区空了接受线程阻塞

package mainimport (
"fmt"
"time"
)
/*
当缓冲区满了发送线程阻塞,缓冲区空了接受线程阻塞
*/func main() {c := make(chan int, 2) //声明一个int类型的有缓冲通道go func() {for i := 0; i < 4; i++ {c <- ifmt.Printf("send %d\n", i)}time.Sleep(5 * time.Second)for i := 4; i < 6; i++ {c <- ifmt.Printf("send %d\n", i)}}()for i := 0; i < 6; i++ {time.Sleep(time.Second)fmt.Printf("receive %d\n", <-c)}
}

3、sync.Mutex

package mainimport ("fmt""sync""time"
)var share_cnt uint64 = 0var lck sync.Mutexfunc incrShareCnt() {for i := 0; i < 1000000; i++ {lck.Lock()share_cnt++ //共有资源lck.Unlock()}fmt.Println(share_cnt)
}
func main() {for i := 0; i < 2; i++ {go incrShareCnt()}time.Sleep(1 * time.Second) //1秒
}

4、sync.Waitgroup:使用等待组进行多个任务的同步,等待组可以保证在并发环境中完成指定数量的任务

package mainimport (
"fmt"
"sync"
)
//使用等待组进行多个任务的同步,等待组可以保证在并发环境中完成指定数量的任务
func main() {fmt.Println("Hello World")var waitgroup sync.WaitGroupwaitgroup.Add(1)go myFunc(&waitgroup)waitgroup.Wait()fmt.Println("Finished Execution")
}
func myFunc(waitgroup *sync.WaitGroup) {fmt.Println("Inside my goroutine")waitgroup.Done()
}

协程的三种同步方式Channel、Mutex、WaitGroup相关推荐

  1. Mysql主从复制的三种同步方式和半同步复制配置

    目录 一.MySQL主从复制的三种同步模式 1.异步复制(Asynchronous replication) 2.全同步复制(Fully synchronous replication) 3.半同步复 ...

  2. Python协程的四种实现方式

    协程 协程不是计算机提供的,是人为创造的上下文切换技术,也可以被称为微线程.简而言之 其实就是在一个线程中实现代码块相互切换执行. 我们知道正常代码是从上到下依次执行,一个方法或函数操作完毕后才会进入 ...

  3. 多线程三种同步方式(模拟银行取款)

    方法一:同步代码块 Accoun package com.bjsxt.synch1;/*** 银行账户类*/ public class Account {private int balance = 6 ...

  4. Unity 之 关于停止协程的五种方式解析

    Unity 之 关于停止协程的五种方式解析 前言:了解协程 方式一:函数的方式 方式二:函数名的方式 方式三:接收返回值 方式四:StopAllCoroutines 方式五:禁用/销毁游戏对象 本文小 ...

  5. Java多线程:多线程同步安全问题的 “三“ 种处理方式 ||多线程 ”死锁“ 的避免 || 单例模式”懒汉式“的线程同步安全问题

    Java多线程:多线程同步安全问题的 "三" 种处理方式 ||多线程 "死锁" 的避免 || 单例模式"懒汉式"的线程同步安全问题 每博一文 ...

  6. python协程怎么做数据同步_Python 中的进程、线程、协程、同步、异步、回调

    进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生? 一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说 ...

  7. pyhon——进程线程、与协程基础概述(同步异步)

    一直以来写博客都是实用主义者,只写用法,没信心写原理,但是每一次写作业的过程都有一种掘地三尺的感觉,终于,写博客困难症重症患者经历了漫长的思想斗争,还是决定把从网上淘到的各种杂货和自己的总结放在一起, ...

  8. 详谈RDMA技术原理和三种实现方式

    ​导读:远程直接内存访问(即RDMA)是一种直接内存访问技术,它将数据直接从一台计算机的内存传输到另一台计算机,无需双方操作系统的介入.RDMA最早在Infiniband传输网络上实现,后来业界厂家把 ...

  9. Python黑魔法--异步IO(asyncio)协程 (三)

    接: https://blog.csdn.net/Enjolras_fuu/article/details/83869864 不同线程的事件循环 很多时候,我们的事件循环用于注册协程,而有的协程需要动 ...

最新文章

  1. 图像分类再思考DNN似乎遵循一种令人困惑的简单策略来对图像分类
  2. AndroidSDK下载以及配置
  3. vim 命令学习(高级篇)
  4. SQL语句执行效率及分析(note)
  5. html注释引用公共头部_HTML注释和引用
  6. Android Intent.FLAG_NEW_TASK详解,包括其他的标记的一些解释
  7. android 发送广播_从0系统学Android--5.2 发送广播
  8. simulink方框_4.4设计Simulink框图的界面
  9. 电脑显示器闪屏_时尚超薄可升降:华硕新品家用护眼显示器MZ27AQL
  10. mysql ---事务
  11. 移动端的click事件延迟触发的原理是什么?如何解决这个问题?
  12. Js/jQuery实时监听input输入框值变化
  13. RPC和Message Passing比较
  14. Android网易歌词json接口,网易云音乐api分析
  15. java .class 反编译工具推荐
  16. cad卸载工具_如何卸载AutoCAD 附上清理注册表方法
  17. 087 定积分求面积应用习题
  18. RK3066查看和修改CPU频率
  19. 绝世巨作,阿里架构师著作的《架构解密:从分布式到微服务》来了
  20. XJTU_ 西安交通大学2020大学计算机作业-第六周

热门文章

  1. RxJS实践,Vue如何集成RxJS
  2. 几分钟了解阿里云云服务器ECS
  3. ADO.NET入门教程(一) 初识ADO.NET
  4. 加密解密、Openssl、自建CA
  5. 怎么一步步编写简单的PHP的Framework(五)
  6. Websphere 7小版本不同导致的JAXP兼容性问题
  7. 【转】Unity中写GLSL(一)—— 简单的diffuse color
  8. U3D中物体的渲染顺序
  9. U3D assetbundle加载与卸载的深入理解
  10. 第三次作业:阅读《构建之法》1-5章有感