广州市建设厅网站首页,苏州行业网站建设服务,管理系统 网站模板,wordpress原创主题作者#xff1a;Mars酱 声明#xff1a;本文章由Mars酱编写#xff0c;部分内容来源于网络#xff0c;如有疑问请联系本人。 转载#xff1a;欢迎转载#xff0c;转载前先请联系我#xff01; 前言
在Java中#xff0c;多线程之间的通信方式有哪些#xff1f;记得吗Mars酱 声明本文章由Mars酱编写部分内容来源于网络如有疑问请联系本人。 转载欢迎转载转载前先请联系我 前言
在Java中多线程之间的通信方式有哪些记得吗Java多线程间通信的解决方案有很多种比如synchronized。使用锁来防止资源乱来一人一个按顺序来要么使用JDK提供的原子对象那些Atomic关键字开头的对象比如AtomicInteger这样可以在多个线程中读写值的时候保证是安全的还有很多其他的方式在go中就一种通道
通道
go的通道我根据java的理解它就是用来解决线程之间通信的东西go里面的关键字叫channels
以下是搜索出来的解释
go语言提倡使用通信的方法代替共享内存当一个资源需要在 goroutine 之间共享时通道在 goroutine 之间架起了一个管道并提供了确保同步交换数据的机制。声明通道时需要指定将要被共享的数据的类型。可以通过通道共享内置类型、命名类型、结构类型和引用类型的值或者指针。这里通信的方法就是使用通道channel如下图所示 图goroutine 与 channel 的通信
是不是和java的线程安全对象是类似或者说是队列总之你可以按照你自己经验去理解。
如何创建通道
go提供了创建通道的语法
通道变量名 : make(chan 数据类型)比如我们可以这样写
// 创建一个int型的通道
ch1 : make(chan int)还可以创建一个接口类型通道比如
ch2 : make(chan interface{})还能创建一个结构体的通道比如
// 创建一个User结构体的通道这个通道是个指针通道
ch3 : make(chan *User)向通道发送数据
go向通道发送数据语法非常简单
通道变量名 - 值我们向上面三个通道名发送数据可以写成
// 1. 给ch1通道传值0
ch1 - 0
// 2. 给ch2通道传字符串实际可以穿任意对象因为前面声明了是interface对象
ch2 - hello, mars酱// 创建一个userInfo结构体并初始化值
userInfo : User{1, mars酱,
}
// 3. 发送一个结构体到通道ch3中
ch3 - userInfo以上代码是无法运行的因为go的通道有个规矩发送和接收必须成对出现不信邪的可以验证一下。
从通道接收数据
go从通道中接收数据的语法也简单
data : - ch1这个语句是个阻塞语句只有当data接收到了值才会执行后续的非阻塞的这样写
data, ok : - ch1data接收的数据如果没有接收到data为0。data为0取决于之前make通道的时候ch1是个int型通道如果是其他类型这个data也应该是其他类型对象
okboolean类型的值表示是否接收到数据
还有个奇葩的写法
- ch1这样写就表示通道里有啥都与我无关忽略掉了。
通道的例子
一个倒数的例子通过通道去实现一下
// author: mars酱
func Test_chanTest(t *testing.T) {// 1. 创建一个通道ch1 : make(chan int)// 2. 启动goroutine并发go func() {// 从5 到 0for i : 5; i 0; i-- {// 3. 发送给通道ch1 - i// 发完后等1秒time.Sleep(time.Second)}}()// 4. 循环接收通道数据for data : range ch1 {fmt.Println(data)if data 0 {break}}
}运行的结果 发射火箭的倒数计时就是这样吧~