Go语言的并发到底是什么?

背景知识

在传统的并发模型中,基于内存分享,各线程通信,需要通过共享变量以及锁的同步机制。并且共享变量很麻烦,要保证:

  1. 内存可见性,保证其他线程可以看到修改后的值
  2. 原子性

Go语言的并发编程

Go语言里有同步的包,类似于Java concurrent包,能够提供锁的功能,但是不是太推荐。Go语言里提倡基于消息传递的并发模型,不共享变量,因此就不涉及锁的问题。
虽然说Go语言里的Goroutine不是真正意义上的协程,但是有时我们就称呼它为“协程”。

  1. 一个go关键词就可以起一个新的Go协程(注意:跟底层协程不是完全相等的)
    在这里插入图片描述
func say(s string)
{
	for i:=0;i<5;i++
	{
		time.Sleep(1 * time.second)
		fmt.Println(s)
	}
}

func main()
{
	go say("world")
	say("hello")
}	
  1. 不同Goroutine之间用信道chan来通信,不使用共享变量。用make(chan关键字,数据类型)创建信道。
    在这里插入图片描述

在这里插入图片描述
注意:

  • 只有发送者才能关闭信道,而接受者不能。向一个已经关闭的信道发送数据会引发程序恐慌。
  • 信道与文件不同,通常情况下无需关闭它们。
  1. select语句使一个Go程可以等待多个通信操作。select会阻塞到某个分支可以继续为止,这时就会执行该分支。当多个分支都准备好时会随机选择一个执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值