channel加锁的理解

来源:13-9 使用channel容易出现deadlock的原因

城中城

2022-05-15

无缓冲的 channel
在写入数据时会加锁并阻塞,直到消费者进行消费后进行解锁

有缓冲的 channel
是不是 缓冲队列满了之后, 写入数据 也是会加锁并阻塞, 直到消费者进行消费了 一个后解锁

并且 有缓存 和 无缓冲最大的区别在于
有缓存 可以在 协程未开启前 提前存放一个数据进去
无缓存 不可以

var wg sync.WaitGroup

func consumer(queue <-chan int) {
	defer wg.Done()
	//data := <-queue
	for {
		data, ok := <-queue
		if !ok {
			break
		} else {
			fmt.Println(data)
			fmt.Println(ok)
			time.Sleep(time.Second)
			//queue <- 2
		}
	}
}

func main() {
	// 有没有缓冲 1. 有缓冲  2. 无缓冲
	// 双向的还是单向    为了安全 还提供了单向channel
	var msg chan int // 双向
	//var msg chan<- int   // 存值
	//var msg <-chan int   // 取值
	msg = make(chan int, 1) // 第一种初始化方式: 无缓冲

	wg.Add(1)
	msg <- 2
	go consumer(msg) // 普通的 channel 可以直接转换为单向的 channel
	msg <- 1         // 将1放入到channel中
	msg <- 3
	msg <- 3
	msg <- 3
	msg <- 3
	msg <- 3
	fmt.Println(555)
	//fmt.Println("主:", <-msg)
	close(msg)
	wg.Wait()
}
写回答

1回答

bobby

2022-05-17

是的,理解没有问题, channel内部就是使用了mutex锁机制实现的

0
0

Go+Python打造电商系统 自研微服务框架 抓紧高薪机遇

快速转型Go工程师,成为具备双语言后端能力的开发者

508 学习 · 530 问题

查看课程