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等待协程运行结束
实现代码如下
输出结果如下