这里简单的介绍一下go中的关于多线程的知识。

Go中的多线程

一、go中简单的并发例子

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "time"
  6. )
  7.  
  8. func Add(x, y int) {
  9. z := x + y
  10. fmt.Print(z, " ")
  11. }
  12.  
  13. func main() {
  14. for i := 0; i < 10; i++ {
  15. go Add(i, i)
  16. }
  17. time.Sleep(1 * time.Second) // 睡眠一秒
  18. fmt.Println("hello world")
  19. }

运行的结果,每次都可能不一样:

  1. hello world

二、go中的并发通信

channel是Go语言在语言级别提供的goroutine间的通信方式。channel是类型相关的。也就是说,一个channel只能传递一种类型的值,这个类型需要在声明channel时指定。

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "time"
  6. )
  7.  
  8. func Count(ch chan int) {
  9. ch <- 1
  10. fmt.Println("Counting")
  11. }
  12.  
  13. func main() {
  14. chs := make([]chan int, 10)
  15. for i := 0; i < 10; i++ {
  16. chs[i] = make(chan int)
  17. go Count(chs[i])
  18. }
  19.  
  20. for _, ch := range(chs) {
  21. fmt.Print(<- ch, " ")
  22. }
  23. time.Sleep(1 * time.Second)
  24. }

运行的结果,每次可能不一样:

  1. Counting
  2. Counting
  3. Counting
  4. Counting
  5. Counting
  6. Counting
  7. Counting
  8. Counting
  9. Counting
  10. Counting

三、go中的select的使用

Go语言直接在语言级别支持 select 关键字,用于处理异步IO问题。

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "time"
  6. )
  7.  
  8. func method1(ch chan string) {
  9. time.Sleep(1 * time.Second)
  10. ch <- "one"
  11. }
  12.  
  13. func method2(ch chan string) {
  14. time.Sleep(2 * time.Second)
  15. ch <- "two"
  16. }
  17.  
  18. func main() {
  19. c1 := make(chan string)
  20. c2 := make(chan string)
  21.  
  22. go method1(c1)
  23. go method2(c2)
  24.  
  25. for i := 0; i < 2; i++ {
  26. select {
  27. case msg1 := <- c1:
  28. fmt.Println("received1: ", msg1)
  29. case msg2 := <- c2:
  30. fmt.Println("received2: ", msg2)
  31. }
  32. }
  33. }

运行的结果如下:

四、go中的sync.Mutex互斥锁

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "sync"
  6. "time"
  7. )
  8.  
  9. // SafeCounter 的并发使用是安全的。
  10. type SafeCounter struct {
  11. v map[string]int
  12. mux sync.Mutex
  13. }
  14.  
  15. // Inc 增加给定 key 的计数器的值。
  16. func (c *SafeCounter) Inc(key string) {
  17. c.mux.Lock()
  18. // Lock 之后同一时刻只有一个 goroutine 能访问 c.v
  19. c.v[key]++
  20. c.mux.Unlock()
  21. }
  22.  
  23. // Value 返回给定 key 的计数器的当前值。
  24. func (c *SafeCounter) Value(key string) int {
  25. c.mux.Lock()
  26. // Lock 之后同一时刻只有一个 goroutine 能访问 c.v
  27. defer c.mux.Unlock()
  28. return c.v[key]
  29. }
  30.  
  31. func main() {
  32. c := SafeCounter{v: make(map[string]int)}
  33. for i := 0; i < 1000; i++ {
  34. go c.Inc("somekey")
  35. }
  36.  
  37. time.Sleep(time.Second)
  38. fmt.Println(c.Value("somekey")) //
  39. }

友情链接

Go基础---->go的基础学习(四)的更多相关文章

  1. #Java学习之路——基础阶段二(第四篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...

  2. SVG 学习<四> 基础API

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

  3. Python基础学习四

    Python基础学习四 1.内置函数 help()函数:用于查看内置函数的用途. help(abs) isinstance()函数:用于判断变量类型. isinstance(x,(int,float) ...

  4. 如何夯实(Java)编程基础,并深入学习和提高

    如何夯实(Java)编程基础,并深入学习和提高? 240赞同反对,不会显示你的姓名 匿名用户 240 人赞同 多学习...网上自学的学习网站很多,见以下榜单~一.汇总榜单: 公开课_学习网站导航 收录 ...

  5. MySQL基础之事务编程学习笔记

    MySQL基础之事务编程学习笔记 在学习<MySQL技术内幕:SQL编程>一书,并做了笔记.本博客内容是自己学了<MySQL技术内幕:SQL编程>事务编程一章之后,根据自己的理 ...

  6. Python基础知识总结笔记(四)函数

    Python基础知识总结笔记(四)函数python中的函数函数中的参数变量作用域偏函数PFA递归函数高阶函数BIFs中的高阶函数匿名函数lambda闭包Closure装饰器Decorator函数式编程 ...

  7. 零基础快速入门web学习路线(含视频教程)

    下面小编专门为广大web学习爱好者汇总了一条完整的自学线路:零基础快速入门web学习路线(含视频教程)(绝对纯干货)适合初学者的最新WEB前端学习路线汇总! 在当下来说web前端开发工程师可谓是高福利 ...

  8. 20165312 C语言基础调查和JAVA学习展望

    C语言基础调查和JAVA学习展望 一.有关学习技能的经历 掌握一项技能,我认为最重要的是练习和认真程度. 我在上幼儿园的时候学过电子琴,上台表演过多次,但是三四年之后就半途而废了,后来小学毕业之后对钢 ...

  9. 零基础的人怎么学习Java

    编程语言Java,已经21岁了.从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的.Java应用的广泛已 ...

  10. PLSQL优化基础和性能优化 (学习总结)

    PLSQL优化基础和性能优化 (学习总结) 网上有一篇关于PLSQL优化的文章,不错,个人根据自己的经验再稍加整理和归纳,总结PLSQL优化和性能调优 适合有一定PLSQL基础,需要进一步提高的学友看 ...

随机推荐

  1. js实现分页的几个源码,看完基本就懂了

    第一种:   <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ...

  2. vm虚拟化问题积累

    EXSi是什么?答:是一个独立的系统,承载了虚拟机管理台,虚拟机存储设备等核心要件的一个系统,需要靠客户机通过vsphere连接后进行管理. 问题集:一.建立桌面池找不到模板机问题: 目前因为此问题已 ...

  3. iOS边练边学--通知机制和键盘处理小练习

    一.发送通知 NSNotification *note = [NSNotification notificationWithName:@"通知的名称,随便写,例如:你妈叫你回家吃饭" ...

  4. DataGridView使用技巧七:列顺序的调整、操作行头列头的标题

    一.列顺序的调整 设定DataGridView的AllowUserToOrderColumns为True的时候,用户可以自由调整列的顺序. 当用户改变列的顺序的时候,其本身的Index不好改变,但是D ...

  5. SSM 整合

    --- 分为三层: DAO层:负责与数据源进行交互 Service:业务处理层,也可称为服务层,对上层提供统一接口的服务. Controller: 控制器层,负责处理来自客户端的请求. 通用配置: d ...

  6. 腾讯云 Linux 挂载数据盘

            查看已挂载的硬盘   1) 运行fdisk -l命令查看硬盘信息.   硬盘从未进行初始化时,需要先创建文件系统,       硬盘格式化   运行mkfs.ext4 device_n ...

  7. org.hibernate.hql.internal.ast.QuerySyntaxExceptionunexpected token: on near line 1

    select d.content,count(s.status) from MesmachineStatus s , Mesmachinestatusdetail d where s.status=d ...

  8. div 画园

    .destination1{ border: #666 solid 1px; box-shadow:-1px 1px 5px 0px #333; width:922px; height:485px; ...

  9. 没有启动 ASP.NET State service错误的解决方法

    具体错误如下: 异常详细信息: System.Web.HttpException: 无法向会话状态服务器发出会话状态请求.请确保已启动 ASP.NET State service,并且客户端和服务器端 ...

  10. linux -- ubuntu 通过命令行,设置文件及其子文件的权限

    想一次修改某个目录下所有文件的权限,包括子目录中的文件权限也要修改,要使用参数-R表示启动递归处理. 例如: [root@localhost ~]# chmod 777 /home/user 注:仅把 ...