zoukankan      html  css  js  c++  java
  • 无缓冲通道 vs 有缓冲通道

    无缓冲通道 vs 有缓冲通道

    1. 无缓冲通道,在通道满了之后就会阻塞所在的goroutine。(需要在其他goroutine中取出该通道中的元素,才能解除它所在通道的阻塞,不然就会一直阻塞下去。)
    2. 有缓冲通道,存完了东西可以不取出来,不会阻塞。
    // 无缓冲通道,阻塞示例
    func chanWillLock() {
    	chanNo := make(chan int) // 无缓冲
    	fmt.Println("1000")
    	// 到这一行就会一直阻塞,
    	// 除非有其他的goroutine中有取走它里面存的东西。
    	chanNo <- 1
    	fmt.Println("2000")
    }
    
    // 无缓冲通道,解除阻塞
    func chanWillUnlockAfter3S() {
    	chanNo := make(chan int)
    	go func() {
    		// 等待
    		time.Sleep(time.Second * 3)
    		// 取出东西,
    		// 之后就会结束chanNo所在的goroutine的阻塞。
    		_ = <-chanNo
    	}()
    	fmt.Println("开始阻塞")
    	// 到这里会阻塞
    	chanNo <- 1000
    	fmt.Println("主 goroutine 退出")
    }
    
    // 有缓冲通道,阻塞示例
    func chanDemo3() {
    	chan1 := make(chan int, 3)
    	fmt.Println("开始")
    	chan1 <- 100
    	chan1 <- 200
    	chan1 <- 300
    	// 容量满了,再放入400的时候才会造成阻塞。
    	//chan1 <- 400
    	fmt.Println("结束")
    }
    
  • 相关阅读:
    2018年7月10日笔记
    2018年7月7日笔记
    2018年7月5日笔记
    2018年7月3日笔记
    sed 命令详解
    《软件构架实践》阅读笔记01
    《掌握需求过程》阅读笔记06
    《掌握需求过程》阅读笔记05
    第十二周进度条
    《掌握需求过程》阅读笔记04
  • 原文地址:https://www.cnblogs.com/sweetXiaoma/p/14435718.html
Copyright © 2011-2022 走看看