Go 语言基础中goroutine和共享内存线程安全是怎样的
发表于:2025-12-04 作者:千家信息网编辑
千家信息网最后更新 2025年12月04日,Go 语言基础中goroutine和共享内存线程安全是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。协程(goro
千家信息网最后更新 2025年12月04日Go 语言基础中goroutine和共享内存线程安全是怎样的
Go 语言基础中goroutine和共享内存线程安全是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
协程(goroutine)是更轻量级的线程
比Java中的线程效率更高
协程语法
go func() { //...}()一旦主goroutine中的代码执行完毕,当前的Go程序就会结束运行,无论其他的 goroutine是否已经在运行了。
让主goroutine等待其它 goroutine:
for i := 0; i < 10; i++ { go func() { fmt.Println(i) }()}time.Sleep(time.Millisecond * 1000)//goroutine 完成的时间很可能小于设置的等待时间,那么这就会造成多余的等待时间怎么才能让goroutine执行完后立刻执行下一个goroutine呢?
go语言提供的WaitGroup可以实现这样的功能.
代码改造:
var wg sync.WaitGroupfor i := 0; i < 10; i++ { wg.Add(1)//每启动一个协程增加一个等待 go func() { fmt.Println(i) wg.Done()//告诉协成等待的事务已经完成 }()}/*这样我们就不用设置等待时间了,但是执行输出的内容是这样的: 3 7 4 8 8 8 9 10 10 10, 很显然这种方式不能保证goroutine拿到唯一整数*/如何保证每个线程拿到的数是惟一的?
代码改造:
var wg sync.WaitGroupfor i := 0; i < 10; i++ { wg.Add(1)//每启动一个协程增加一个等待 go func(j int) {//把j只是个形参可以任意命名 fmt.Println(j) wg.Done()//告诉协成等待的事务已经完成 }(i)//把实参i传递给形参j}//执行结果:0 2 1 6 3 4 5 8 7 9我们把i值传递给j,i的变化不会影响j的值,所以输出的结果是唯一的
共享内存线程安全
func TestCounter(t *testing.T) { counter := 0 for i := 0; i < 5000; i++ { go func() { counter++ }() } time.Sleep(1 * time.Second) t.Logf("counter = %d", counter)}//执行结果: 4760 出现了线程安全的问题和大多数语言一样go也支持加锁保证线程的安全:
func TestCounterWaitGroup(t *testing.T) { var mut sync.Mutex//创建锁对象 var wg sync.WaitGroup counter := 0 for i := 0; i < 5000; i++ { wg.Add(1)//每启动一个协程增加一个等待 go func() { defer func() { mut.Unlock()//释放锁 }() mut.Lock()//开启锁 counter++ wg.Done()//告诉协成等待的事务已经完成 }() } wg.Wait()//等待协程 t.Logf("counter = %d", counter)}看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。
线程
安全
时间
语言
事务
代码
结果
保证
内存
内容
形参
帮助
支持
改造
输出
运行
基础
语言基础
清楚
不用
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
安徽宝鼎网络技术 小贷
美国互联网科技公司市值
南开区企业网络技术售后保障
叠纸 服务器开发
google代理服务器
新开业软件开发企业涉税问题
国家网络安全研究院有限公司
网络安全联动机制
网络安全网络安全法特点
阳泉软件开发电话
html显示数据库
软件开发入门教程自学
最好的APP软件开发商
学网络技术的买什么电脑比较好
软件开发术语表
数据库中手机号的类型是什么
微型服务器ic
北京高性能服务器虚拟主机
泰州企业网络安全准入控制供应商
江门专业软件开发费用
苏州智慧园区软件开发
金元宝商业管理系统服务器设置
固定电话网络技术
密码学与网络安全的关系
如何打造网络安全环境
软件开发商退税流程
特叔网站小程序软件开发
当前没有微博数据库
软件开发李晓石家庄
网络电玩软件开发公司