您现在的位置是:首页 > 学习笔记 > Go语言Go语言

Go并发

冰山2019-02-14【Go语言】人已围观

简介1.并发
1.1并发概述
1.2进程并发
1.3线程并发
1.4协程并发
1.5Go并发
2.Goroutine
2.1Goroutine定义
2.2Goroutine的创建
2.3Goroutine特性
3.channel管道
3.1定义channel变量
3.2无缓冲的channel
3.3有缓冲的channel
3.4关闭channel
4.读写锁与互斥锁
4.1死锁
4.2互斥锁
4.3读写锁


channel是Go语言中的一个核心类型,可以把它看成管道。并发核心单元通过它就可以发送或者接收数据进行通讯。

channel是一个数据类型,主要用来解决go程的同步问题以及go程之间数据共享(数据传递)的问题。

goroutine运行在相同的地址空间,因此访问共享内存必须做好同步。goroutine 奉行通过通信来共享内存,而不是共享内存来通信。

引⽤类型 channel可用于多个 goroutine 通讯。其内部实现了同步,确保并发安全。



 

3.1定义channel变量


和map类似,channel也一个对应make创建的底层数据结构的引用。

当我们复制一个channel或用于函数参数传递时,我们只是拷贝了一个channel引用,因此调用者和被调用者将引用同一个channel对象。和其它的引用类型一样,channel的零值也是nil。

定义一个channel时,也需要定义发送到channel的值的类型。channel可以使用内置的make()函数来创建。

chan是创建channel所需使用的关键字。Type 代表指定channel收发数据的类型。

当我们复制一个channel或用于函数参数传递时,我们只是拷贝了一个channel引用,因此调用者和被调用者将引用同一个channel对象。和其它的引用类型一样,channel的零值也是nil。

当参数capacity= 0 时,channel 是无缓冲阻塞读写的;当capacity > 0 时,channel 有缓冲、是非阻塞的,直到写满 capacity个元素才阻塞写入。

channel非常像生活中的管道,一边可以存放东西,另一边可以取出东西。channel通过操作符 <- 来接收和发送数据,发送和接收数据语法:
    channel <- value      //发送value到channel
    <-channel             //接收并将其丢弃
    x := <-channel        //从channel中接收数据,并赋值给x
    x, ok := <-channel    //功能同上,同时检查通道是否已关闭或者是否为空

默认情况下,channel接收和发送数据都是阻塞的,除非另一端已经准备好,这样就使得goroutine同步变的更加的简单,而不需要显式的lock。

示例:

package main

import "fmt"

func main() {
   c := make(chan int)

   go func() {
      defer fmt.Println("子协程结束")

      fmt.Println("子协程正在运行……")

      c <- 666 //666发送到c

   }()

   num := <-c //从c中接收数据,并赋值给num

   fmt.Println("num = ", num)
   fmt.Println("main协程结束")
}

输出结果:
子协程正在运行……
子协程结束
num =  666
main协程结束

Process finished with exit code 0
 

3.2无缓冲的channel


无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道。这种类型的通道要求发送goroutine和接收goroutine同时准备好,才能完成发送和接收操作。否则,通道会导致先执行发送或接收操作的 goroutine 阻塞等待。

这种对通道进行发送和接收的交互行为本身就是同步的。其中任意一个操作都无法离开另一个操作单独存在。

阻塞:由于某种原因数据没有到达,当前协程(线程)持续处于等待状态,直到条件满足,才解除阻塞。
同步:在两个或多个协程(线程)间,保持数据内容一致性的机制。

下图展示两个 goroutine 如何利用无缓冲的通道来共享一个值:

1)在第 1 步,两个 goroutine 都到达通道,但哪个都没有开始执行发送或者接收。

2)在第 2 步,左侧的 goroutine 将它的手伸进了通道,这模拟了向通道发送数据的行为。这时,这个 goroutine 会在通道中被锁住,直到交换完成。

 3/7   首页 上一页 1 2 3 4 5 6 下一页 尾页

  • 微信扫一扫~
  • 支付宝扫一扫~

很赞哦! ()

上一篇:面向对象

下一篇:Golang之网络编程

相关文章

文章评论

本站推荐