// This file contains the implementation of Go channels.

// Invariants:

//  At least one of c.sendq and c.recvq is empty,

//  except for the case of an unbuffered channel with a single goroutine

//  blocked on it for both sending and receiving using a select statement,

//  in which case the length of c.sendq and c.recvq is limited only by the

//  size of the select statement.

//

// For buffered channels, also:

//  c.qcount > 0 implies that c.recvq is empty.

//  c.qcount < c.dataqsiz implies that c.sendq is empty.

import (

"runtime/internal/atomic"

"unsafe"

)

  • channel中的数据结构是hchan{}

chan如何初始化:

func makechan(t *chantype, size int) *hchan

内存分配方式:

不带缓冲区

c = (*hchan)(mallocgc(hchanSize, nil, true))

带缓冲区

c = (*hchan)(mallocgc(hchanSize+uintptr(size)*elem.size, nil, true))

—————-

lock(&c.lock)

if c.closed != 0 {

unlock(&c.lock)

panic(plainError("send on closed channel"))

}

——————

因为chansend中有加锁的步骤,故多个goroutine读写是安全的。

PipedInputStream类 与 PipedOutputStream类 用于在应用程序中创建管道通信。

一个PipedInputStream实例对象必须和一个PipedOutputStream实例对象进行连接而产生一个通信管道。

(必须使用connect,in.connect(out) 或out.connect(in),效果是等价的)

PipedOutputStream可以向管道中写入数据,PipedIntputStream可以读取PipedOutputStream向管道中写入的数据,这两个类主要用来完成线程之间的通信。

数据从[out,in)范围内读取,并写入到[in,out)范围内

{ - - - X X X X X X X - - - - - }

^             ^

|             |

out           in

{ X X X X - - - - - - - - X X X }

^               ^

|               |

in              out

在PipedIntputStream中,缓冲区默认大小是:

private static final int DEFAULT_PIPE_SIZE = 1024;

写入数据时:

synchronized void receive(byte b[], int off, int len)  throws IOException

会对byte[],及偏移量进行计算

Goroutine通信与thread in java间的通信的更多相关文章

  1. 使用wait/notify实现线程间的通信

    之前对Java多线程中的wait/notify机制理解都不是很清晰,最近看了一本技术书,通过里面的讲解再配上一些博客,终于算是对wait/notify有了进一步的理解. 下面就来说说我对这两个方法的认 ...

  2. java多线程详解(6)-线程间的通信wait及notify方法

    Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New) ...

  3. ZeroMQ(java)之I/O线程的实现与组件间的通信

    算是开始读ZeroMQ(java)的代码实现了吧,现在有了一个大体的了解,看起来实现是比较的干净的,抽象什么的不算复杂... 这里先来看看它的I/O线程的实现吧,顺带看看是如何实现组件的通信的.... ...

  4. Java多线程中线程间的通信

    一.使用while方式来实现线程之间的通信 package com.ietree.multithread.sync; import java.util.ArrayList; import java.u ...

  5. Java 多线程(七) 线程间的通信——wait及notify方法

    线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法和三个wait方法: http://docs.oracle.com/ ...

  6. 【转】Java学习---线程间的通信

    [原文]https://www.toutiao.com/i6572378564534993415/ 两个线程间的通信 这是我们之前的线程. 执行效果:谁抢到资源,谁运行~ 实现线程交替执行: 这里主要 ...

  7. Java多线程之线程的状态以及线程间协作通信导致的线程状态转换

      转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6561589.html  一:线程的状态以及变化图 Java中线程中状态可分为五种:New(新建状态),Ru ...

  8. 【转】Java学习:Java中的线程之线程间的通信

    hello各位小伙伴 今天我们来搞一下 线程之间的通信 ( • ̀ω•́ )✧ 让线程按照我们的想法来执行 两个线程间的通信 这是我们之前的线程. 执行效果:谁抢到资源,谁运行~ 实现线程交替执行: ...

  9. Java基础教程:多线程基础(2)——线程间的通信

    Java基础教程:多线程基础(2)——线程间的通信 使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使程序员对各线程任务在处理的过程中进行有效的把控与监督. 线程间的通信 ...

随机推荐

  1. webstorm编辑器使用

    1.自动生成vue文件模板,如图

  2. what?iView的DropDown没有element的split-button?提issure?等不及了,自己实现一个

    开始正文之前,有必要先说自己实现这个组件的必要性描述. 话说大家做表格时,增删查改按钮都是放在哪里的?最简单的方式应该是这样: 是不是感觉奇丑无比啊,于是改成了这样: 但是这种操作按钮一多后就没位置放 ...

  3. Lua table遍历

    工作中,栽了一个“坑”,特此备录. [1]遍历table1,每次结果可能都不同 -- 获取value ", addr="xian"} for k, v in pairs( ...

  4. mui返回上个页面并刷新数据

    转 https://blog.csdn.net/mercedescc/article/details/82769264 今天写项目遇到个问题,就是B页面支付操作完成以后,点击返回按钮要到A页面,此时A ...

  5. Extundelete 数据恢复

    Extundelete 数据恢复 “rm -rf /*” 是我们经常使用的命令,操作不慎全盘接蹦,从删库到跑路,身为过来人的我们都经历过rm带来的痛苦. 不要慌,当我们有了Extundelete就可以 ...

  6. 提升node.js中使用redis的性能

    问题初现 某基于node.js开发的业务系统向外提供了一个dubbo服务,提供向第三方缓存查询.设置多项业务数据并聚合操作结果.在QPS达到800时(两台虚拟机,每台机器4Core8G4node进程) ...

  7. dnsmasq 设置自动获取主机名

    A1_IP:192.168.164.145 A1# yum install dnsmasq -y A1# echo "addn-hosts=/etc/domains" >&g ...

  8. ready

    // 定义一个动物类 function Animal (name) { // 属性 this.name = name || 'Animal'; // 实例方法 this.sleep = functio ...

  9. scala链接mysql

    方法一:链接并操作mysql //链接Mysqlval driver = "com.mysql.jdbc.Driver"val url = "jdbc:mysql://1 ...

  10. xml转json和实体类的两种方式

    本文为博主原创,未经允许不得转载: xml在http通信中具有较高的安全性和传输速度,所以应用比较广泛, 在项目中往往需要对xml,json和实体类进行相互转换,在这里总结一下自己所用到的一些方法: ...