并发
文章平均质量分 95
Coding Machine
加油
展开
-
并发编程-11.CompletableFuture 异步编排使用
CompletableFuture 异步编排Future 是 Java 5 添加的类,用来描述一个异步计算的结果。使用isDone方法检查计算是否完成,或者使用get阻塞住调用线程,直到计算完成返回结果,你也可以使用cancel 方法停止任务的执行。在 Java 8 中, 新增加了一个类: CompletableFuture,它实现了 Fucture 接口,提供了非常强大的 Future 的扩展功能,简化异步编程的复杂性,提供了函数式编程的能力,可以 通过回调的方式处理计算结果,并且提供了转换和组合 C原创 2021-12-30 22:58:24 · 399 阅读 · 0 评论 -
并发编程-10.Fuctur,Callable,Thread,ForkJoin,Disruptor
一、任务性质类型CPU密集型(CPU-bound)CPU 密集型也叫计算密集型,指的是系统的硬盘、内存性能相对 CPU 要好很多,此时,系统运作大部分的状况是 CPU Loading 100%,CPU 要读/写 I/O(硬盘/内存),I/O 在很短的时间就可以完成,而 CPU 还有许多运算要处理,CPU Loading 很高。特点:要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。线程数一般设置为: 线程数 = CPU核数+1 (现代CPU支持超线程)原创 2021-10-25 23:26:52 · 279 阅读 · 0 评论 -
并发编程-09.Executor线程池原理与源码解析
一、线程调度CPU资源的最小单位,线程模型分为KLT模型与ULT模型,JVM使用的KLT模 型,Java线程与OS线程保持1:1的映射关系,也就是说有一个java线程也会在操作系统里有 一个对应的线程。详见前面的文章。Java线程的生命状态 :NEW,新建RUNNABLE,运行BLOCKED,阻塞WAITING,等待TIMED_WAITING,超时等待TERMINATED,终结线程状态转换图二、协程协程 (纤程,用户级线程),目的是为了追求最大力度的发挥硬件性能和提升软件的速度,原创 2021-10-17 15:21:14 · 199 阅读 · 0 评论 -
并发编程-08.HashMap等集合
HashMap数据结构JDK 1.6 数组 + 链表JDK 1.8 开始 数组 + 链表 + 红黑树引入链表结构解决hash冲突,JDK1.8开始采用尾插法(1.8以前头插法),链表时间复杂度O(n)hash 并不是采用取模(%)运算,而是采用位&运算,从效率上来讲,位运算效率远高于%取模运算,位运算是最接近机器能识别的语言虽然引入了红黑树,解决了链表成环问题,但效率并未得到大的提升,在数据量较小的时候效率甚至会更低,在数据量较大的时候效率大概有 5-10% 的提升HashMap容原创 2021-09-29 22:18:12 · 212 阅读 · 0 评论 -
并发编程-07.Atominc 原子包及 Unsafe 魔法类
一、Atominc 原子包在 Atomic 包中有12个类,四种原子更新方式,分别是原子更新基本类型、数组、引用和字段。Atomic 包里的类基本都是使用 Unsafe 实现的包装类。基本类: AtomicInteger、AtomicLong、AtomicBoolean引用类型: AtomicReference、AtomicReference的ABA实例、AtomicStampedRerence、AtomicMarkableReference数组类型: AtomicIntegerArray、Atom原创 2021-09-24 00:36:58 · 225 阅读 · 0 评论 -
并发编程-06.并发工具类
SemaphoreSemaphore 字面意思是信号量的意思,它的作用是控制访问特定资源的线程数目,通过协调各个线程,以保证合理的使用资源。底层依赖 AQS 的状态 State,是在生产当中比较常用的一个工具类。使用场景常用于资源有明确访问数量限制的场景,常用于限流,可实现熔断、降级等处理 。例如:数据库连接池,连接不能超过限制数量,当连接达到了限制数量后,后面的线程只能排队等前面的线程释放了数据库连接才能获得数据库连接。例如:某些排队场景,能够容纳同时在线人数有限,超过后只能排队等待。例如:资原创 2021-09-17 21:15:43 · 146 阅读 · 0 评论 -
并发编程-05.阻塞队列BlockingQueue详解
队列的类型无限队列(unbounded queue) 无容量限定,只随存储变化有限队列(bounded queue) 定义了最大容量向无限队列添加元素的所有操作都将永远不会阻塞(也是线程安全的),,因此它可以增长到非常大的容量。 使用无限阻塞队列BlockingQueue 设计生产者 - 消费者模型时最重要的是消费者应该能够像生产者向队列添加消息一样快地消费消息 。否则可能内存不足而抛出OutOfMemory 异常。数据结构1.通常使用链表或数组实现2.一般具有 FIFO(先进先出) 特性,原创 2021-09-14 23:14:28 · 528 阅读 · 0 评论 -
多线程基础-01.基础
1.进程与线程进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程就可以视为程序的一个实例。线程一个进程之内可以分为一到多个线程。一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行Java 中,线程作为最小调度单位,进程作为资源分配的最小单位。 在 w原创 2021-05-23 17:35:31 · 262 阅读 · 0 评论 -
并发编程-04. AQS 与 Lock 源码详解
1.什么是 AQS? AQS(AbstractQueuedSynchronizer) 定义了一套多线程访问共享资源 的同步器框架,是一个依赖状态(state)的同步器。Java 并发编程的核心包 java.concurrent.util 下的大多数同步器都是基于 AQS 实现的,例如:Latch,Barrier,BlockingQueue等。1.1.AQS 具备的特性阻塞等待队列共享/独占公平/非公平可重入允许原创 2021-09-08 00:11:06 · 358 阅读 · 0 评论 -
多线程基础-02.线程间的通信与线程安全问题
线程间的通信原创 2021-05-30 17:39:32 · 511 阅读 · 3 评论 -
并发编程-03.synchronized详解
1.设计同步器的意义 临界资源: 多线程中的共享、可变资源。这种资源可能是: 对象、变量、文件等。所以需要采用同步机制来协同对对象可变状态的访问。共享:资源可以由多个线程同时访问可变:资源可以在其生命周期内被修改1.1.如何解决线程并发安全问题?解决方案: 序列化访问临界资源,即:同一时刻只能有一个线程访问临界资源(同步互斥访问)。Java 提供的两种方式:synchronized 和 Locksynchro原创 2021-09-06 00:09:54 · 174 阅读 · 0 评论 -
并发编程-02.JAVA内存模型(JMM) 与 volatile 详解
1.Java内存模型JVM定义了一套在多线程读写共享数据时(成员变量,数组)时,对数据的可见性、有序性和原子性的规则和保障。1.1.原子性**定义:**一个操作在CPU中不可以中途暂停再调度,要么全部执行完成,要么全部都不执行问题: 两个线程对初始值的静态变量一个做自增,一个做自减同样做10000次的结果很可能不是0解决关键字: synchronized语法sychronized(对象) { 需要做原子操作的代码}建议:用sychronized对对象加锁的力度建议大一点(减少加解锁原创 2021-05-23 23:12:24 · 385 阅读 · 3 评论 -
并发编程-01.认识底层操作系统与并发基础知识
并发原创 2021-08-29 15:13:27 · 284 阅读 · 0 评论