Go基础---->go的基础学习(四)
这里简单的介绍一下go中的关于多线程的知识。
Go中的多线程
一、go中简单的并发例子
- package main
- import (
- "fmt"
- "time"
- )
- func Add(x, y int) {
- z := x + y
- fmt.Print(z, " ")
- }
- func main() {
- for i := 0; i < 10; i++ {
- go Add(i, i)
- }
- time.Sleep(1 * time.Second) // 睡眠一秒
- fmt.Println("hello world")
- }
运行的结果,每次都可能不一样:
- hello world
二、go中的并发通信
channel是Go语言在语言级别提供的goroutine间的通信方式。channel是类型相关的。也就是说,一个channel只能传递一种类型的值,这个类型需要在声明channel时指定。
- package main
- import (
- "fmt"
- "time"
- )
- func Count(ch chan int) {
- ch <- 1
- fmt.Println("Counting")
- }
- func main() {
- chs := make([]chan int, 10)
- for i := 0; i < 10; i++ {
- chs[i] = make(chan int)
- go Count(chs[i])
- }
- for _, ch := range(chs) {
- fmt.Print(<- ch, " ")
- }
- time.Sleep(1 * time.Second)
- }
运行的结果,每次可能不一样:
- Counting
- Counting
- Counting
- Counting
- Counting
- Counting
- Counting
- Counting
- Counting
- Counting
三、go中的select的使用
Go语言直接在语言级别支持 select 关键字,用于处理异步IO问题。
- package main
- import (
- "fmt"
- "time"
- )
- func method1(ch chan string) {
- time.Sleep(1 * time.Second)
- ch <- "one"
- }
- func method2(ch chan string) {
- time.Sleep(2 * time.Second)
- ch <- "two"
- }
- func main() {
- c1 := make(chan string)
- c2 := make(chan string)
- go method1(c1)
- go method2(c2)
- for i := 0; i < 2; i++ {
- select {
- case msg1 := <- c1:
- fmt.Println("received1: ", msg1)
- case msg2 := <- c2:
- fmt.Println("received2: ", msg2)
- }
- }
- }
运行的结果如下:
四、go中的sync.Mutex互斥锁
- package main
- import (
- "fmt"
- "sync"
- "time"
- )
- // SafeCounter 的并发使用是安全的。
- type SafeCounter struct {
- v map[string]int
- mux sync.Mutex
- }
- // Inc 增加给定 key 的计数器的值。
- func (c *SafeCounter) Inc(key string) {
- c.mux.Lock()
- // Lock 之后同一时刻只有一个 goroutine 能访问 c.v
- c.v[key]++
- c.mux.Unlock()
- }
- // Value 返回给定 key 的计数器的当前值。
- func (c *SafeCounter) Value(key string) int {
- c.mux.Lock()
- // Lock 之后同一时刻只有一个 goroutine 能访问 c.v
- defer c.mux.Unlock()
- return c.v[key]
- }
- func main() {
- c := SafeCounter{v: make(map[string]int)}
- for i := 0; i < 1000; i++ {
- go c.Inc("somekey")
- }
- time.Sleep(time.Second)
- fmt.Println(c.Value("somekey")) //
- }
友情链接
Go基础---->go的基础学习(四)的更多相关文章
- #Java学习之路——基础阶段二(第四篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- SVG 学习<四> 基础API
目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...
- Python基础学习四
Python基础学习四 1.内置函数 help()函数:用于查看内置函数的用途. help(abs) isinstance()函数:用于判断变量类型. isinstance(x,(int,float) ...
- 如何夯实(Java)编程基础,并深入学习和提高
如何夯实(Java)编程基础,并深入学习和提高? 240赞同反对,不会显示你的姓名 匿名用户 240 人赞同 多学习...网上自学的学习网站很多,见以下榜单~一.汇总榜单: 公开课_学习网站导航 收录 ...
- MySQL基础之事务编程学习笔记
MySQL基础之事务编程学习笔记 在学习<MySQL技术内幕:SQL编程>一书,并做了笔记.本博客内容是自己学了<MySQL技术内幕:SQL编程>事务编程一章之后,根据自己的理 ...
- Python基础知识总结笔记(四)函数
Python基础知识总结笔记(四)函数python中的函数函数中的参数变量作用域偏函数PFA递归函数高阶函数BIFs中的高阶函数匿名函数lambda闭包Closure装饰器Decorator函数式编程 ...
- 零基础快速入门web学习路线(含视频教程)
下面小编专门为广大web学习爱好者汇总了一条完整的自学线路:零基础快速入门web学习路线(含视频教程)(绝对纯干货)适合初学者的最新WEB前端学习路线汇总! 在当下来说web前端开发工程师可谓是高福利 ...
- 20165312 C语言基础调查和JAVA学习展望
C语言基础调查和JAVA学习展望 一.有关学习技能的经历 掌握一项技能,我认为最重要的是练习和认真程度. 我在上幼儿园的时候学过电子琴,上台表演过多次,但是三四年之后就半途而废了,后来小学毕业之后对钢 ...
- 零基础的人怎么学习Java
编程语言Java,已经21岁了.从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的.Java应用的广泛已 ...
- PLSQL优化基础和性能优化 (学习总结)
PLSQL优化基础和性能优化 (学习总结) 网上有一篇关于PLSQL优化的文章,不错,个人根据自己的经验再稍加整理和归纳,总结PLSQL优化和性能调优 适合有一定PLSQL基础,需要进一步提高的学友看 ...
随机推荐
- js实现分页的几个源码,看完基本就懂了
第一种: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ...
- vm虚拟化问题积累
EXSi是什么?答:是一个独立的系统,承载了虚拟机管理台,虚拟机存储设备等核心要件的一个系统,需要靠客户机通过vsphere连接后进行管理. 问题集:一.建立桌面池找不到模板机问题: 目前因为此问题已 ...
- iOS边练边学--通知机制和键盘处理小练习
一.发送通知 NSNotification *note = [NSNotification notificationWithName:@"通知的名称,随便写,例如:你妈叫你回家吃饭" ...
- DataGridView使用技巧七:列顺序的调整、操作行头列头的标题
一.列顺序的调整 设定DataGridView的AllowUserToOrderColumns为True的时候,用户可以自由调整列的顺序. 当用户改变列的顺序的时候,其本身的Index不好改变,但是D ...
- SSM 整合
--- 分为三层: DAO层:负责与数据源进行交互 Service:业务处理层,也可称为服务层,对上层提供统一接口的服务. Controller: 控制器层,负责处理来自客户端的请求. 通用配置: d ...
- 腾讯云 Linux 挂载数据盘
查看已挂载的硬盘 1) 运行fdisk -l命令查看硬盘信息. 硬盘从未进行初始化时,需要先创建文件系统, 硬盘格式化 运行mkfs.ext4 device_n ...
- 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 ...
- div 画园
.destination1{ border: #666 solid 1px; box-shadow:-1px 1px 5px 0px #333; width:922px; height:485px; ...
- 没有启动 ASP.NET State service错误的解决方法
具体错误如下: 异常详细信息: System.Web.HttpException: 无法向会话状态服务器发出会话状态请求.请确保已启动 ASP.NET State service,并且客户端和服务器端 ...
- linux -- ubuntu 通过命令行,设置文件及其子文件的权限
想一次修改某个目录下所有文件的权限,包括子目录中的文件权限也要修改,要使用参数-R表示启动递归处理. 例如: [root@localhost ~]# chmod 777 /home/user 注:仅把 ...