代码演示

package main

import (
"fmt"
"runtime"
"sync/atomic"
"time"
) func main() {
var ops uint64 = 0
for i := 0; i < 50; i++ {
go func() {
for {
atomic.AddUint64(&ops, 1)
runtime.Gosched()
}
}()
}
time.Sleep(time.Second)
opsFinal := atomic.LoadUint64(&ops)
fmt.Println("ops:", opsFinal)
}

  

代码运行结果

ops: 7838509

  

代码解读

  • go语言中最主要的状态管理方式是通过通道间的沟通完成的,本例子中,我们用sync/atomic包在多个go协程中进行原子计数
  • 先定义一个ops为无符号整形(永远是正整数),然后启动50个协程,对计数器每隔一定时间进行加一的操作
  • 使用&来读取ops的内存地址,这样可以修改原来的值,不会拷贝新值
  • runtime.Gosched()的作用是,可以由其它的协程继续执行。比如第一个协程for循环执行到这里,由第二个协程可以接力过来继续执行
  • 最后等待1秒钟,留给协程足够的时间执行,最终读取了计数器的值

最新文章

  1. c# 调用 matlab
  2. 【AT91SAM3S】SAM3S-EK Demo工程中,LCD驱动程序的加载(函数指针结构体)
  3. json转换为javabean
  4. Light OJ 1019 - Brush (V)(图论-dijkstra)
  5. 利用matlab编写实现显示fmri切片slice图像 混合显示 不同侧面显示 可叠加t检验图显示 by DR. Rajeev Raizada
  6. 【HDOJ】4057 Rescue the Rabbit
  7. lucene4.6 索引创建和搜索例子
  8. 6. java.lang.IllegalArgumentException
  9. CentOS 6.4 文件夹打开方式
  10. 微信小程序开源项目库集合
  11. opencv鼠标操作及GUI矩形绘画
  12. nmap简介和使用
  13. spring websocket报错:No matching message handler methods.
  14. 7-安装Spark
  15. S5PV210 串口配置与实验(轮询方式)
  16. 在HashTable上下文中,同步指的是什么?
  17. 利用matlab写一个简单的拉普拉斯变换提取图像边缘
  18. 【Android】Handler详解
  19. ssh&amp;scp指定密钥
  20. 安装PHP扩展-----phpredis

热门文章

  1. php基础学习中认为重点的知识
  2. python 输出日志到文件和控制台
  3. Flask 基础组件(十):中间件
  4. python之爬虫(十) Selenium库的使用
  5. Shaderlab-10chapter-立方体纹理、玻璃效果
  6. bzoj3383[Usaco2004 Open]Cave Cows 4 洞穴里的牛之四*
  7. 基于Redis分布式锁的正确打开方式
  8. Go Pentester - TCP Proxy
  9. Ethical Hacking - GAINING ACCESS(8)
  10. python多进程之multiprocessing