golang学习3.26

1.协程

创建一个简单协程

需要导入time包

使用go关键字创建协程

实现代码如下

输出结果如下

2.锁的应用

这是我看到的一个题目

当多个协程间使用到了相同内存空间中的变量时,有可能出现同时对数据进行读写的情况,这时可能会导致数据不准确,打个比方:

用户A和用户B是一对夫妻,两人共同使用着一张银行卡,卡中余额为50000元。碰巧有一天,用户A正将6000元工资存入银行,在同一时刻用户B支出了500元购买衣物,两笔操作同时发生。

按照正常逻辑,要么是先存入后支出,余额为50000+6000-500=55500,要么是先支出后存入50000-500+6000=55500,这两种方式都不会有问题。但在程序执行的过程中,这两笔操作是不具备原子性的,都要对数据先读后写,分两步才能完成。有可能A的操作刚读出数据还未写入时,B的操作完成了读写,之后A的写操作才完成,这样B的操作就被无效了,余额为50000+6000=56000元;也有可能B的操作刚读出数据还未写入时,A的操作完成了读写,之后B的写操作才完成,这样A的操作就被无效了,余额变为50000-500=49500元。

就可以通过锁来解决这个问题

具体实现代码如下

输出结果如下

当跨协程访问同一个资源时,如果都是只读就没必要加锁,又读又写就需要加锁

通过读写锁降低性能损耗

读操作用RLock()[read lock]

写操作用Lock()

实现代码如下

输出结果如下

3.等待组的应用

除了用time.sleep还可以用waitgroup等待协程执行完毕,因为我们大多数情况下无法估计协程的运行时长,需要有个能准确获取到协程结束运行的方法waitgroup就可以

使用waitgroup等待协程运行结束

实现代码如下

输出结果如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值