常规定义的channel都是默认不带缓冲的,如下代码所示

package main
import (
"fmt"
)
func main() {
c := make(chan int)
c <- 1
fmt.Println(<-c)
}

  

 
 
运行上述代码,会产生一个错误
 
 
因为在默认不带缓冲的channel中,每一个发送者与接收者都会阻塞当前线程,只有当接受者与发送者都准备就绪了,channel才能正常使用,正确的使用如下所示
 
package main
import (
"fmt"
)
func main() {
c := make(chan int)
//使用Goroutine使当前channel的发送不会阻塞线程
go func() {
c <- 1
}()
fmt.Println(<-c)
}

  

 
那么如何让程序同步执行,但是又不会阻塞线程呢?这是就可以用带缓冲的channel来进行实现,如下代码所示:
 
  1. package main
    import (
    "fmt"
    )
    func main() {
    //创建一个缓冲大小为2的channel
    c := make(chan int, 2)
    c <- 1
    c <- 2
    fmt.Println(<-c)
    fmt.Println(<-c)
    }
 
此时,运行 程序可以正确的得到以下结果
 
 
注意,这里的channel并不能无限的接收数据而不造成阻塞,能够接收的数据的个数取决于channel定义时,设定的缓冲的大小,只有在这个缓冲大小范围之内,channel的发送才不会造成阻塞
 
  1. package main
    import (
    "fmt"
    )
    func main() {
    //创建一个缓冲大小为2的channel
    c := make(chan int, 2)
    c <- 1
    c <- 2
    //这里channel的发送超出了缓冲的大小,所以会因为阻塞而导致程序死锁
    c <- 3
    fmt.Println(<-c)
    fmt.Println(<-c)
    }
 
以上程序依旧会因为channel的发送而导致程序阻塞,最后导致死锁
 
注意,虽然带缓冲的channel可以让发送在缓冲范围内不阻塞线程,但是channel的接收还是会照常被阻塞的。

无缓冲和带缓冲channel的区别的更多相关文章

  1. 带缓冲I/O和不带缓冲I/O的区别与联系

    转自:http://blog.csdn.net/lmh12506/article/details/6803847 首先要明白不带缓冲的概念:所谓不带缓冲,并不是指内核不提供缓冲,而是只单纯的系统调用, ...

  2. 带缓冲I/O 和不带缓冲I/O的区别与联系

    首先要明白不带缓冲的概念:所谓不带缓冲,并不是指内核不提供缓冲,而是只单纯的系统调用,不是函数库的调用.系统内核对磁盘的读写都会提供一个块缓冲(在有些地方也被称为内核高速缓存),当用write函数对其 ...

  3. [GO]无缓冲通道(unbuffered channel)

    无缓冲通道(unbuffered channel)是指在接收前没有能力保存任何值的通道,在之前的例子中使用的都是无缓冲通道,需要注意的是,对于无缓冲通道而言,不管是往通道里写数据还是从通道里读数据,都 ...

  4. 文件I/O(不带缓冲)之原子操作

    一.添写至一个文件 考虑一个进程,它要将数据添加到一个文件尾端.早期的UNIX系统并不支持open的O_APPEND选项,所以程序被编写成下列形式: ) < ) /* position to E ...

  5. 带缓冲的IO和不带缓冲的IO

    文件描述符: 文件描述符是一个小的非负整数,是内核用来标识特定进程正在访问的文件 标准输入/输出/出错: shell为每个程序打开了三个文件描述符,STDIN_FILEON,STDOUT_FILEON ...

  6. JavaScript原生折叠扩展收缩菜单带缓冲动画

    JavaScript原生折叠扩展收缩菜单带缓冲动画 @落雨 <div id="div_two" style="display: none;"> &l ...

  7. js+css实现带缓冲效果右键弹出菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 文件I/O(不带缓冲)概述

    一.引言 UNIX系统中大多数文件I/O只需用到5个函数:open.read.write.lseek以及close.这些函数经常被称为不带缓冲的I/O(unbuffered I/O).术语不带缓冲指的 ...

  9. UNIX环境编程学习笔记(2)——文件I/O之不带缓冲的 I/O

    lienhua342014-08-25 1 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数.当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符. ...

随机推荐

  1. c# 如何得到一个字符的ASCII码

    '; int b = (int)a; 就这么简单..

  2. Ubuntu 16.04安装SecureCRT替代XShell

    XShell应该是最强大的,在Ubuntu下只有SecureCRT能实现跨平台(Linux/Windows/Mac),并且可以实现Tab的功能等.当然,还有其它的类似PuTTY这些.Windows下建 ...

  3. 《JavaScript编程精解》读书笔记

    第一章 JavaScript基础:值.变量.控制流程 JavaScript里有六种基本类型:number类型.string类型.boolean类型.object.function和undefined. ...

  4. AOP的最佳注入方式——MSIL注入

    下载PostSharp(Visual Studio Gallery). 安装一个AOP编译器和引入PostSharp.Aspects(注意安装过程中请使用免费的Express版本),然后初步演示代码: ...

  5. web项目 log4j2 指定配置文件路径

    pom.xml需要额外引入的jar: <dependency> <groupId>org.apache.logging.log4j</groupId> <ar ...

  6. Mybatis的输入映射和输出映射

    一.输入映射   通过parameterType指定输入参数类型,类型可以是简单类型.HashMap.pojo的包装类型.   1.简单类型   映射文件: <!-- 查询sql语句配置使用se ...

  7. Scrum 冲刺博客第一篇

    一.各个成员在 Alpha 阶段认领的任务 成员 Alpha 阶段认领的任务 黄腾龙 主要功能模块代码开发 叶城龙 部分模块代码开发,博客撰写 李心宇 代码测试,博客撰写 余腾鑫 界面设计,博客撰写 ...

  8. [转].Net Core Web应用发布至IIS后报“An error occurred while starting the application”错误

    本文转自:http://www.cnblogs.com/TomGui/p/6438686.html An error occurred while starting the application. ...

  9. C#之RabbitMQ系列(一)

    RabbitMQ–环境搭建 MQ MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接 ...

  10. SSRS 通过Customer Code访问Dataset

    A dataset in Reporting Services is not the same type of object as an ADO.Net dataset.  A report data ...