Go 语言基础中goroutine和共享内存线程安全是怎样的
发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,Go 语言基础中goroutine和共享内存线程安全是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。协程(goro
千家信息网最后更新 2024年11月20日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安全错误
数据库的锁怎样保障安全
济源计算机网络技术专业
数据库检测工具
四川专业软件开发报价
公安机关网络安全风险评估报告
取得三级数据库证书的要求
java数据加入数据库
可视聊天软件开发
扫描打非护苗网络安全
服务器安全软件接口拦截
城管执法程序及步骤软件开发
关于网络安全讲座的英语作文
cc攻击主要破坏网络安全
大学生网络安全法实施时间
养猪视频软件开发
威海商友网络技术怎么样
service传递数据库
小学网络安全安全计划
服务器电源 550w 改
数据库中自动增长字段
单独物业管理模块软件开发
ffmpeg 服务器
中转服务器软件源码
员工之家登录不上需要切换服务器
fmt 2021 数据库
甲骨文数据库异地双活
有关网络安全的事故警示视频
图书租赁系统数据库表格
软件开发的结构性生命周期
数据库结构中主要的三个层次
网络技术名词缩写