
0704【高并发】
线程、CAS AQS 、同步容器
努力的阳光蓝孩
学习一时爽,一直学习一直爽
展开
-
[并发实现原理] 0705 ForkJoinPool Worker线程的阻塞—唤醒机制
1、唤醒 /** * Tries to create or activate a worker if too few are active. * * @param ws the worker array to use to find signallees * @param q a WorkQueue --if non-null, don't retry if now empty */ final void signalWork(WorkQue原创 2020-07-21 07:32:20 · 501 阅读 · 0 评论 -
[并发实现原理] 0801 CompletableFuture
一、简单用法1、CompletableFuture实现了Future接口,所以它也具有Future的特性:调用get()方法会阻塞在那,直到结果返回2、 提交任务:runAsync与supplyAsyncpackage com.current.flame.aqs.analysis;import lombok.ToString;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.CompletableFuture;impor原创 2020-07-06 23:46:07 · 236 阅读 · 0 评论 -
[并发实现原理] 0704 ForkJoinPool状态控制
一、状态变量ctl解析1、ForkJoinPool中有ctl变量负责表达ForkJoinPool的整个生命周期和相关的各种状态。long型变量2、ctl 组成 /* Bits and masks for field ctl, packed with 4 16 bit subfields: * AC: Number of active running workers minus target parallelism * TC: Number of total worke原创 2020-07-05 23:04:57 · 478 阅读 · 0 评论 -
【高并发】18 缓冲
一、介绍1、为什么需要缓冲?缓解数据库压力、提高用户体验。浏览器APP网路转发linux服务器集群数据库 存储2、缓冲特征命中率: 命中数/(命中数 + 没有命中数)最大元素(空间)清空策略:FIFO 、LFU 、LRU 、过期时间、随机等3、缓冲命中率影响因素业务场景和业务需求缓冲的设计(粒度 和 策略)缓冲容量和基础设施4、缓冲分类和应用场景本地缓冲: 编程实现(成员变量、局部变量、静态变量)、Guava Cache原创 2020-07-05 00:02:42 · 122 阅读 · 0 评论 -
[并发实现原理] 0703 ForkJoinPool 工作窃取队列
一、介绍1、工作窃取算法,是指一个Worker线程在执行完毕自己队列中的任务之后,可以窃取其他线程队列中的任务来执行,从而实现负载均衡,以防有的线程很空闲,有的线程很忙。这个过程要用到工作窃取队列。队列: 基于一个普通的数组实现2、队列的三个操作Worker线程自己,在队列头部,通过对queueTop指针执行加、减操作,实现入队或出队,是单线程的。其他Worker线程,在队列尾部,通过对queueBase进行累加,实现出队操作,窃取,是多线程的,需要通过CAS操作。que原创 2020-07-04 16:59:20 · 1330 阅读 · 0 评论 -
[并发实现原理] 0702 ForkJoinPool 结构
一、分析 基于JDK 1.81、ForkJoinPool 初始化做了什么事情? 工作过程是什么样的?Returns the number of processors available to the Java virtual machinedefaultForkJoinWorkerThreadFactorycheckParallelism()、 checkFactory() 、checkPermissioninitialize field offsets for CA原创 2020-07-04 16:58:21 · 243 阅读 · 0 评论 -
[并发实现原理] 0701 ForkJoinPool 用法
一、介绍1、分治。其基本思路是:将一个大的任务分为若干个子任务,子任务分别计算,然后合并出最终结果,计算过程中通常会用到递归。2、ForkJoinPoolJDK7提供的一种“分治算法”的多线程并行计算框架。Fork意为分叉,Join意为合并,一分一合,相互配合,形成分治算法。可以将ForkJoinPool看作一个单机版的Map/Reduce,这里的并行不是多台机器并行计算,而是多个线程并行计算。3、ThreadPoolExecutor,ForkJoinPool 对比ForkJ原创 2020-07-04 16:48:47 · 277 阅读 · 0 评论 -
【高并发】15 死锁、多线程并发最佳实战
一、死锁的必要条件1、互斥条件2、请求和保持条件3、不剥夺条件4、环路等待条件package com.current.flame.deadLock;import lombok.extern.slf4j.Slf4j;/** * @author haoxiansheng * 死锁发生 * 简单的死锁 */@Slf4jpublic class DeadLock implements Runnable { private int flag = 1; // 静态对象是类原创 2020-07-03 23:36:43 · 222 阅读 · 0 评论 -
【高并发】12 BlockingQueue
一、介绍1、适用于生产者消费者模型puttakeThread oneBlockingQueueThread two2、说明Throws ExceptionSpecial VueueBlocksTimes Outinsertadd(o)offer(o)put(o)Removeremove(o)poll()take()Examineelement()peek()3、种类ArrayBlockingQueueDelayQueue原创 2020-07-03 23:12:31 · 88 阅读 · 0 评论 -
【高并发】14 线程池
一、new Thread 弊端1、每次new Thread 新建对象,性能差2、线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机或者OOM3、缺少更多功能,如更多执行、定期执行、线程中断二、线程池的好处1、重用存在的线程,减少对象创建、消亡的开销,性能佳2、可有效控制最大并发线程,提高系统资源利用率,同时可以避免过多资源竞争,避免阻塞3、提供定时执行、定期执行、单线程、并发数控制等功能三、线程池配置1、corePoolSize:核心线程数量2、maximu原创 2020-07-03 23:11:49 · 154 阅读 · 0 评论 -
[并发实现原理] 01 多线程基础
一、线程的优雅关闭1、为什么需要优雅关闭?运行一半的线程能否强制杀死?杀死线程的方法:stop()、destory()函数不建议使用,强制杀死线程,则线程中所使用的资源不能正常关闭(例如文件描述符、网络连接等)。一个线程一旦运行起来,就不要去强行打断它,合理的关闭办法是让其运行完(也就是函数执行完毕),干净地释放掉所有资源,然后退出。如果是一个不断循环运行的线程,就需要用到线程间的通信机制,让主线程通知其退出。2、守护线程介绍a: 当在一个JVM进程原创 2020-07-02 23:39:07 · 138 阅读 · 0 评论 -
【高并发】11 AQS代码案例
一、CountDownLatch1、代码一package com.current.flame.aqs;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * @author haoxiansheng */@Slf4原创 2020-07-02 07:50:15 · 169 阅读 · 0 评论 -
【高并发】10 AQS(AbstractQueuedSynchronized) 介绍
一、队列1、Sync queue 、Condition queuewaitStatus pre next thread nextWaiterwaitStatus pre next thread nextWaiterwaitStatus pre next thread nextWaiterwaitStatus pre next thread nextWaiterwaitStatus pre next thread nextWaiter2、使用Node实现FIFO队列,可以用于构建锁或者其他同步装置的基础原创 2020-07-02 07:49:50 · 211 阅读 · 0 评论 -
【高并发】09 线程安全-并发容器J.U.C
一、线程安全并发容器JUC1、CopyOnWriteArrayListpackage com.current.flame.current;import com.current.flame.annoations.ThreadSafe;import lombok.extern.slf4j.Slf4j;import java.util.List;import java.util.concurrent.*;/** * @author haoxiansheng */@Slf4j@Threa原创 2020-07-01 23:16:38 · 190 阅读 · 0 评论 -
【高并发】08 线程安全同步容器
一、Vector1、代码package com.current.flame.syncContainer;import com.current.flame.annoations.ThreadSafe;import lombok.extern.slf4j.Slf4j;import java.util.Vector;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;imp原创 2020-07-01 07:25:35 · 156 阅读 · 0 评论 -
【高并发】07 线程不安全类与写法
一、StringBuilder 、StringBuffer1、为什么需要提供StingBuilder 和StringBufferStingBuilder 线程不安全StringBuffer 线程安全 效率低因为加了synchronized在类中声明变量要要考虑多线程问题方法内部使用局部变量堆栈封闭 没有并发问题stringBuilder 长度变化有概率小于5000package com.current.flame.commonUnsafe;impor原创 2020-07-01 07:24:57 · 140 阅读 · 0 评论 -
【高并发】06 不可变对象
一、不可变对象需要满足的条件1、对象创建以后其状态就不能修改2、对象所有域都是final类型3、对象是正确创建的(在对象创建期间,this 引用没有逸出)二、final关键字、修饰类方法变量1、修饰类: 不能被继承2、修饰方法:锁定方法不被继承类修改效率3、修饰变量: 基本数据类型变量、引用类型变量package com.current.flame.immutable;import com.current.flame.annoations.NotThreadSafe;原创 2020-07-01 07:24:24 · 182 阅读 · 0 评论 -
【高并发】05 线程封闭 ThreadLocal
一、三种方式1、Ad-hoc 线程封闭: 程序控制实现,最糟糕2、堆栈封闭:局部变量、无并发问题3、ThreadLocal线程封闭:特别好的封闭方法二、代码1、ThreadLocalpackage com.current.flame.filter;/** * @author haoxiansheng * ThreadLocal 代码事例 */public class RequestHolder { private final static ThreadLocal<Lon原创 2020-06-29 09:18:37 · 134 阅读 · 0 评论 -
【高并发】04 线程安全性、并发安全性、可见性
一、线程安全性1、当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中,不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类时线程安全的。2、原子性提供了互斥访问,同一时刻只能有一个线程来对它进行操作3、可见性一个线程对主内存的修改可以及时的被其他线程观察到。4、有序性一个线程观察其他线程中的指令执行顺序,由于指令重排序的存在,该观察结果一般杂乱无序二、可见性1、导致共享变量在线程间不可见的原因线程交叉执行原创 2020-06-29 09:17:50 · 245 阅读 · 0 评论 -
【高并发】03 原子性 Atomic包
一 Atomic包1、CAS Unsafe.compareAndSwapInt2、AtomicLong LongAdder3、AtomicReference 、AtomicReferenceFieldUpdaterpackage com.current.flame.test;import lombok.Getter;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.atomic.AtomicIntegerFieldU原创 2020-06-28 09:14:16 · 160 阅读 · 0 评论 -
【高并发】02 并发工具测试类
1、Postman:模拟Http请求2、Apache Bench(AB): Apache 附带的工具,测试网站性能3、JMeter: Apche 组织开发的压力测试工具4、代码测试: 结合Semaphore、CountDownLatchpackage com.current.flame.test;import com.current.flame.annoations.NotThreadSafe;import lombok.extern.slf4j.Slf4j;import java.uti原创 2020-06-24 09:09:55 · 239 阅读 · 0 评论 -
【高并发】01并发与高并发
二、案例package com.example.overlap;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Semaphore;/** * @author haoxiansheng * 并发简单案例计数器 */@Slf4jpublic cla原创 2020-06-23 23:36:00 · 223 阅读 · 0 评论 -
【高并发】四、NIO 简介
一、介绍1、在1.4版本之前,Java IO类库是阻塞IO;从1.4版本开始,引进了新的异步IO库,被称为JavaNew IO类库,简称为JAVA NIO。2、New IO类库的目标,就是要让Java支持非阻塞IO,基于这个原因,更多的人喜欢称Java NIO为非阻塞IO(Non-Block IO),称“老的”阻塞式Java IO为OIO(Old IO)。3、NIO弥补了原来面向流的OIO同步阻塞的不足,它为标准Java代码提供了高速的、面向缓冲区的IO。4、Java NIO由以下三个核心组件组成原创 2020-06-15 09:19:32 · 259 阅读 · 0 评论 -
【高并发】三、高并发 之 合理配置来支持百万级并发连接
一、为什么要进行配置1、即使采用了最先进的模型,如果不进行合理的配置,也没有办法支撑百万级的网络连接并发。2、Linux操作系统中文件句柄数的限制。顺便说下,在生产环境中,大家都使用Linux系统,所以,后续文字中假想的生产操作系统,都是Linux系统。另外,由于大多数同学使用Windows进行学习和工作,因此,后续文字中假想的开发所用的操作系统都是Windows系统。3、在生产环境Linux系统中,基本上都需要解除文件句柄数的限制。原因是,Linux的系统默认值为1024,也就是说,一个进程最多可以原创 2020-06-15 09:18:47 · 839 阅读 · 0 评论 -
【高并发】二、高并发 之 四种主要的IO模型
一、同步阻塞IO(Blocking IO)1、阻塞IO:指的是需要内核IO操作彻底完成后,才返回到用户空间执行用户的操作。阻塞指的是用户空间程序的执行状态。传统的IO模型都是同步阻塞IO。在Java应用程序进程中,默认情况下,所有的socket连接的IO操作都是同步阻塞IO(BlockingIO)。在阻塞式IO模型中,Java应用程序从IO系统调用开始,直到系统调用返回,在这段时间内,Java进程是阻塞的。返回成功后,应用进程开始处理用户空间的缓存区数据。2、同步IO,是一种用户原创 2020-06-15 09:18:06 · 738 阅读 · 0 评论 -
【高并发】一、高并发 之 IO 读写的基础原理
一、基础知识1、用户程序进行IO的读写,依赖于底层的IO读写,基本上会用到底层的read&write两大系统调用。2、在不同的操作系统中,IO读写的系统调用的名称可能不完全一样,但是基本功能是一样的。3、read系统调用,并不是直接从物理设备把数据读取到内存中;write系统调用,也不是直接把数据写入到物理设备。上层应用无论是调用操作系统的read,还是调用操作系统的write,都会涉及缓冲区。4、调用操作系统的read,是把数据从内核缓冲区复制到进程缓冲区;而write系统调用,是把原创 2020-06-15 09:17:15 · 610 阅读 · 0 评论