// 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. MVC(I)

    实际开发我们是这样的:

  2. Git 教程(一):简介和安装

    为什么要编写这个教程?因为我在学习Git的过程中,买过书,也在网上Google了一堆Git相关的文章和教程,但令人失望的是,这些教程不是难得令人发指,就是简单得一笔带过,或者,只支离破碎地介绍Git的 ...

  3. 2018-2019-2 20165335『网络对抗技术』Exp5:MSF基础应用

    主动攻击的实践: ms17_010(成功) 浏览器攻击的实践:ms14_064(成功) 客户端攻击的实践:adobe reader PDF的攻击(成功) 运用辅助模块的实践:VNC弱口令破解/绕过(失 ...

  4. Python的伪造数据生成器:Faker

    我们在开发中常常需要利用一些假数据来做测试,这种时候就可以使用 Faker 来伪造数据从而用来测试. Faker 是一个可以让你生成伪造数据的Python包.当你需要初始化数据库,创建美观的XML文档 ...

  5. liunx驱动----异步通知

    查询:消耗资源 中断:read 一直要去读 poll :指定起始时间 异步通知 signal 测试程序 include <stdio.h> include <signal.h> ...

  6. Oarcle之组函数

    组函数 avg 求20部门的平均薪水为多少? select avg(sal) avgsal from emp where deptno = 20:  sum 求20部门的员工的总薪水 select s ...

  7. react-native 导航器 react-navigation 3.x 使用

    React-navigation 介绍 React Navigation 源于 React Native 社区对一个可扩展且易于使用的导航解决方案的需求,它完全使用 JavaScript 编写. (如 ...

  8. js中创建对象的4种方法

    1.直接创建,不可复用式创建var obj = new Object(); obj.name = ""; obj.id = ""; 2.使用工厂方法来创建对象, ...

  9. 数据服务器------sql

    服务器:能够在网站中提供各种(浏览网页,收发邮件视频,语言)等服务器的软件与硬件集合. 数据库服务器(软件):(特点:永久海量存储数据:高速的查询){所有其他软件没有的特点} 数据库服务器分类 网状数 ...

  10. STM32C语言与MDK基础

    Ifdef条件编译 Extern相当于全文件的全局变量,使用前需声明,加extern就行 Static,只在当前.c文件起作用,也可以定义函数,作用是提供HALL库用,不是给用户用. Weak前加两个 ...