package main

import "fmt"

func main() {
/*
以下程序会导致死锁
c := make(chan int)
c <- 10
n1 := <-c
fmt.Println(n1)
为什么在同一个goroutine中使用无缓冲通道会导致死锁?
原因:1. 如果通道无缓冲区,则发送方会阻塞,直到接收方接收到该值
2. 如果通道有缓冲区,则发送方会阻塞到值被复制到缓冲区,然后解堵塞,
如果缓冲区已满,则会阻塞到其它goroutine从通道缓冲区中取走一个数据,然后再将值复制到缓冲区,最后解堵塞
*/
// 以下程序就可以正常执行,main goroutine负责从无缓冲通道中接收数据,子goroutine负责往通道中写入数据
c := make(chan int)
go func() {
for i := 0; i < 10; i++ {
c <- i * 10
}
close(c) // 关闭通道
}()
// 使用此方法必须关闭通道
for i := range c {
fmt.Println(i)
}
/* 使用此方法可以比关闭通道
for i := 0; i < 10; i++ {
fmt.Println(<-c)
}
*/
}

  

golang中为何在同一个goroutine中使用无缓冲通道会导致死锁的更多相关文章

  1. [Go] golang无缓冲通道实现工作池控制并发

    展示如何使用无缓冲的通道创建一个goroutine池,控制并发频率1.无缓冲通道保证了两个goroutine之间的数据交换2.当所有的goroutine都忙的时候,能够及时通过通道告知调用者3.无缓冲 ...

  2. Golang并发编程有缓冲通道和无缓冲通道(channel)

    无缓冲通道 是指在接收前没有能力保存任何值得通道.这种类型的通道要求发送goroutine和接收goroutine同时准备好,才能完成发送和接收操作.如果两个goroutine没有同时准备好,通道会导 ...

  3. golang channel无缓冲通道会发生阻塞的验证

    公司搞了午间技术par,本周我讲的主题是关于无缓冲通道channel是否会发生阻塞,并进行了验证. go语言中channel分为无缓冲通道和有缓冲通道两种 channel提供了一种在goroutine ...

  4. Springboot中如何在Utils类中使用@Autowired注入bean

    Springboot中如果希望在Utils工具类中,使用到我们已经定义过的Dao层或者Service层Bean,可以如下编写Utils类: 1. 使用@Component注解标记工具类Statisti ...

  5. Unix/Linux操作系统中如何在sqlplus/rman中使用方向键

    默认情况下在Unix/Linux中使用Oracle的sqlplus/rman是无法使用↑↓←→几个方向键进行操作的,要想达到Windows下使用sqlplus/rman的效果需要安装rlwrap. r ...

  6. rails中如何在a标签中添加其他标签

    最近在用rails写一个项目练练手,然后遇到了一个问题,就是用 <% link_to("首页", root_path) %> 生成一个a标签,之后就在想我怎么在这个a标 ...

  7. NDK编程中如何在C文件中打印调试信息

      1,在Android.mk文件中加上 LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog LOCAL_PATH := $(call my-dir)include ...

  8. unix/linux中如何在vi编辑器中方便的跳转到首行和末行?

    1.跳转到首行,:0/:1 2.跳转到末行,shift +g/G/:$

  9. jsp <form>表单提交中如何在value属性中写表达式

    <input type="text" name="grop_id" value="<%=rs.getString(2)%>" ...

随机推荐

  1. SpringBoot使用Aspect切面拦截打印请求参数

    引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...

  2. 鱼书_第一章_Python入门

    Python版本 Python有Python 2.x和Python 3.x两个版本.两个版本不兼容,可能出现用Python 3.x编的代码不能被Python 2.x执行的情况. Python安装 An ...

  3. nim_duilib之virtualListbox用法(22)

    概述 本文将介绍virtualListbox的用法. 更多请参考源码. 一个样式 样式丑了点,勿喷. 重写函数 使用virtualListbox, 需要一个派生类(继承自基类VirtualListIn ...

  4. 【LeetCode】104. Maximum Depth of Binary Tree 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:BFS 方法二:DFS 参考资料 日期 题目 ...

  5. 【LeetCode】89. Gray Code 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  6. Oracle VirtualBox 配置宿主机与虚拟机互访

    写作原因 之前经常使用 VMware Workstation Pro,由于是非正常付费使用的不打算再用了.替代品就是 Oracle VirtualBox,但是发现了一个问题: "我想用NAT ...

  7. 第二十九个知识点:什么是UF-CMA数字签名的定义?

    第二十九个知识点:什么是UF-CMA数字签名的定义? 第16篇博客给出了DSA,Schnoor和RSA-FDH签名方案的细节,但是签名方案是什么?它应该保证什么样的安全性? 一个签名方案\(S\)是一 ...

  8. BBN+

    目录 motivation settings results motivation 观测用BBN的模式训练出来的模型, 配上不同的\(\alpha\), 结果会如何. settings Attribu ...

  9. electron使用动态配置文件及持久化存储

    1.如何在打包之后,把动态配置文件比如[config.json]放在根目录,不被打包到asar文件中 //解决思路,electron可以拷贝静态资源,比如你把config.json放在项目的根目录下, ...

  10. CS229 机器学习课程复习材料-线性代数

    本文是斯坦福大学CS 229机器学习课程的基础材料,原始文件下载 原文作者:Zico Kolter,修改:Chuong Do, Tengyu Ma 翻译:黄海广 备注:请关注github的更新,线性代 ...