channel 用于在并发单元之间通信,类似于管道 ch := make(chan int) // 创建一个channel defer close(ch) ch <- v // 向管道中写入 v := <-ch // 从管道读取 v, ok := <-ch channel类型 channel有三种类型[可读可写 | 只读 | 只写] chan T // rw chan<- T // w <-cha
10、I/O相关概念 https://www.cnblogs.com/xiaoxi/p/6525396.html 10.1、同步和异步 同步就是:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行; 异步就是:如果有多个任务或者事件
一、源码分析步骤 1.掌握线程池工作状态 2.任务在线程池工作流程 3.线程池任务等待队列管理策略 4.线程池任务拒绝策略 5.线程池关闭策略 6.线程池初始化策略 7.线程池中线程数量扩容方案二、线程池工作状态 1.工作状态
JAVA并发包提供三个常用的并发队列实现,分别是:ConcurrentLinkedQueue、LinkedBlockingQueue和ArrayBlockingQueue. ConcurrentLinkedQueue使用的是CAS原语无锁队列实现,是一个异步队列,入队速度很快,出队进行了加锁,性能稍慢; LinkedBlockingQueue也是阻塞队列,入队和出队
注意:该随笔内容完全引自http://wsmajunfeng.iteye.com/blog/1629354,写的很好,非常感谢,复制过来算是个积累,怕以后找不到。 一. 前言 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建
客户端在三次握手收到第二个分节之后,connect就立马返回,但是服务端只有收到最后一个分节才把连接纳入全连接队列。 子进程终止的时候,会给父进程发信号SIGCHILD,但该信号默认被忽略,导致子进程变成僵尸进程。 这里提一下linux为什么设置僵死态:为了保存子进程的一些执行信息(进程I
一、阻塞与非阻塞I/O 阻塞与非阻塞I/O 阻塞和非阻塞主要是指调用某个系统函数时,这个函数是否会导致我们的进程进入 sleep()【卡在这休眠】状态而言的; a)阻塞I/O 我调用一个函数,这个函数就卡在在这里,整个程序流程不往下走了【休眠sleep】,该函数卡在这里等待一个事情发生, 只有这个
以下都是个人通过视频学习的理解,描述不够严谨但大体如此,参考链接:https://www.bilibili.com/video/BV1fg411376j?p=5创建一个套接字的时候会创建一个用于监听的文件描述符(fd),每个套接字只有一个监听fd fd又分为监听fd和通信fd每个fd(不论是监听fd和通信fd结构都是一样的)都有一个
Java并发 一,进程和线程 进程和线程都是CPU调用任务的概念。 进程:系统是系统分配资源的最小单位,进程包含1到多的线程,进程内的线程,可以有空闲的内存。 线程:系统调度任务的最小单位。 二,并发和并行 CPU是按进度顺序执行的,并发本质吧上是串行执行的。由于操作系统任务调度器的存
一、阻塞队列简介 队列常被用来解决生产——消费者问题,Java中定义了Queue接口以及通用的一些抽象方法 public interface Queue<E> extends Collection<E> { // 添加一个元素,添加成功返回true,如果队列满了就抛出异常 boolean add(E e); //添加一个元素,添加成
转载: https://mp.weixin.qq.com/s/yhyr6M0hVEgQPyER0XyXuQ MySQL都有哪些锁呢? - 小林coding的回答 - 知乎 https://www.zhihu.com/question/422489306/answer/2062958661 在MySQL 里,根据加锁的范围,可以分为 全局锁、表级锁 和 行锁 三类。 全局锁 要使用全局锁,则要执行这
信号量PV操作 基本介绍 信号量(Semaphore):是表示资源的实体,是一个与队列有关的整型变量,其值仅能由P、V操作改变。 信号量分为:公用信号量和私用信号量。 公用信号量:用于实现进程间的互斥,初值通常设为1,它所联系的一组并发进程均可对它实施P、V操作; 私用信号量:用于实现进程间的
package com.atgu; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; class MyResource{ private volatile boolean FLAG=true
1、纯内存访问。redis的所有数据都在内存中,这是快的主要原因 2、非阻塞IO。redis使用epoll作为IO多路复用的实现。 3、单线程避免了线程切换和资源竞争带来的开销。 单线程问题:耗时较长的命令可能导致阻塞
环境 Time 2022-01-11 Rust 1.57.0 Tokio 1.15.0 概念 参考:https://docs.rs/tokio/latest/tokio/runtime/struct.Builder.html 对于阻塞任务,Tokio 会新启动一个线程来运行,可以设置启动的最大线程数,默认是 512。 示例 main.rs use std::{io, thread, time::Duration}; use tokio
目录go 互斥锁的实现1. mutex的数据结构1.1 mutex结构体,抢锁解锁原理1.2 mutex方法2. 加解锁过程2.1 简单加锁2.2 加锁被阻塞2.3 简单解锁2.4 解锁并释放协程3. 自旋过程3.1 什么是自旋3.2 自旋条件3.3 自旋的优势3.4 自旋的问题4. Mutex模式4.1 Normal模式4.2 Starving模式5. Wo
环境 Time 2022-01-10 Rust 1.57.0 Tokio 1.15.0 概念 参考:https://docs.rs/tokio/latest/tokio/runtime/struct.Runtime.html shutdown_timeout 方法关闭运行时会阻塞,等待任务完成。参数可以提供最大等待时间,超时将被强制结束。 示例 main.rs use std::{io, thread, time::Dura
环境 Time 2022-01-10 Rust 1.57.0 Tokio 1.15.0 概念 参考:https://docs.rs/tokio/latest/tokio/runtime/struct.Runtime.html shutdown_background 方法可以立即关闭运行时,不会产生阻塞。通常在另一个运行时中调用,避免阻塞。 由于 shutdown_background 不等待任务结束,可能会产
环境 Time 2022-01-10 Rust 1.57.0 Tokio 1.15.0 概念 参考:https://docs.rs/tokio/latest/tokio/runtime/struct.Runtime.html spawn_blocking 方法可以接收一个闭包,可以是一个阻塞任务。 Tokio 有两种线程。一种给异步任务的核心线程,一种是运行同步任务的阻塞线程。 核心线程
线程的生命周期?线程有几种状态? 线程通常有五种状态,创建,就绪,运⾏、阻塞和死亡状态: 创建状态(New):新创建了⼀个线程对象。 仅仅是线程对象,操作系统线程还没有创建关键操作: new Thread(); 就绪状态(Runnable):线程对象创建后,其他线程调⽤了该对象的start⽅法。该状态的线程位于
文件IO:阻塞IO/非阻塞IO 阻塞IO:当用户程序执行read,线程会被阻塞,一直等到内核数据准备好,并把数据从内核缓冲区拷贝到用户缓冲区。当拷贝过程完成,read才会返回。 非阻塞IO:read请求在数据没有准备好的情况下立刻返回,可以继续往下执行,但是这时候用户程序一直在轮询内核,直到数据准备好,内
I/O介绍 I/O(Input/Outpu) 即输入/输出 。 学术的说 I/O 是信息处理系统(计算机)与外界(人或信息处理系统)间的通信。如计算机,即 CPU 访问任何寄存器和 Cache 等封装以外的数据资源都可当成 I/O ,包括且不限于内存,磁盘,显卡。 软件开发中的 I/O 则常指磁盘、网络 IO。 同步 & 异步 同步
产生阻塞的场景: 读设备(dev)文件、读网络文件 tty就是显示终端设备,/dev/tty 这是会读到键盘的值并写道标准输出 第一个hello是自己输入的,是一直在等着,所以是阻塞 非阻塞的代码如下图所示: 此时read返回-1的时候,errno会变成EAGAIN或EWOULDBLOCK,表示非阻塞状态且当前无数据;阻塞情况
package com.leetcode.random.difficulty; import java.util.ArrayDeque; import java.util.Deque; import java.util.HashSet; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; pu
一、基于TCP协议的套接字编程(进阶) 加上链接循环和通信循环: 二、基于UDP协议的套接字编程 三、进程的理论 程序:一堆代码,没有生命周期 进程:动态的,有生命周期 例如: 菜谱就是程序,做菜的过程就是进程