摘要:
Async注解 1.自定义使用的线程池 @EnableAsync @Configuration public class AsyncConfig implements AsyncConfigurer { @Bean("customAsyncPool") @Override public Thread 阅读全文
摘要:
1.Springboot启动原理分析 1.1 继承spring-boot-starter-parent,就相应的继承了一些版本控制的东西 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-star 阅读全文
摘要:
1.worker_processes auto; worker进程数,最优值取决于许多因素,包括但不限于cpu核的数量,磁盘空间,负载模式。设置为cpu核数是一个很好的开始,auto会自动检查cpu核数,并设置它。 2.worker_rlimit_nofile 100000; 更改工作进程的最大打开 阅读全文
摘要:
Nginx的压缩配置 gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/x-javascript t 阅读全文
摘要:
日志文件按天自动切割 mv /data1/logs/access.log /data1/logs/20090318.log kill -USR1 Nginx主进程号 阅读全文
摘要:
Nginx的平滑升级 (1)使用新的可执行程序替换旧的可执行程序,将新版本编译安装到旧版本的nginx安装目录中 (2)kill -USR2 nginx的主进程号 (3)nginx主进程自动重命名它的pid文件,然后执行新版本的nginx可执行程序,依次启动主进程和新的工作进程 (4)kill -W 阅读全文
摘要:
1.client_max_body_size 300m; 允许客户端请求的最大单个文件字节数,出现在请求头的Content-Length字段 2.client_body_buffer_size 128k; 指定连接请求使用的缓冲区大小,默认8K/16K 如果客户端请求一个文件大于128k,则ngin 阅读全文
摘要:
Nginx中支持的几个重要信号 TERM,INT 快速关闭信号 QUIT 从容关闭 HUP 重载配置用新的配置开始新的工作进程从容关闭旧的工作进程(用的比较多) USR1 重新打开日志文件(用的比较多) USR2 平滑升级可执行程序 WINCH 从容关闭工作进程 阅读全文
摘要:
使用效果 新的文档使用 <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <!--在引用时请在maven中央仓库搜索3.X最新版本号--> 阅读全文
摘要:
springboot启动后执行某些动作 1.主要是springboot的启动run方法里调用了callRunners,会去调用实现了ApplicationRunner接口的类的方法 public ConfigurableApplicationContext run(String... args) { 阅读全文
摘要:
1.自定义Aspect @Component @Aspect public class JournalServiceAspect { private static final Logger logger = LoggerFactory.getLogger(JournalServiceAspect.c 阅读全文
摘要:
1.Namespace 资源隔离 保证应用于应用隔离 pid 进程编号 net 网络设备,网络协议栈,端口 ipc 信号量,消息队列,共享内存,内存隔离 mount 文件系统,挂载点 uts 主机名和主机域 user 操作进程的用户和用户组(linux内核在3.8以上才实现,所以centos要7以上 阅读全文
摘要:
1.反射概念 反射是java中强大的工具,灵活代码 运行时装配的概念,无需组件之间代码连接 2.反射作用 反射机制访问java对象的属性,方法,构造方法等 3.jdk中提供的反射的类 java.lang.Class; java.lang.reflect.Constructor; java.lang. 阅读全文
摘要:
JAVA事件机制 事件机制包含3个部分:事件,监听器,事件源 1.事件 继承java.util.EventObject类,封装了事件源对象及跟踪事件相关信息 自定义事件类CustomEvent import java.util.EventObject; public class CustomEven 阅读全文
摘要:
1.Java类加载过程 java文件从编码到执行,一般包括2个过程 编译 运行 编译是把java文件通过javac编译成字节码文件class 运行是把class文件交给jvm执行 类的加载过程:就是jvm把class文件中的类信息加载到内存,并解析生成对应class对象的过程 jvm惰性加载,不是一 阅读全文
摘要:
1.如何优化一个询价应用的核心代码呢? ThreadPoolExecutor+Future的方案, 用3个线程异步执行,通过3次调用future的get方法后去查价结果,然后价格保存在数据库中 // 创建线程池 ExecutorService executor = Executors.newFixe 阅读全文
摘要:
1.抓子线程的信息, 子线程的断点打的时候,可以选择 小红点,右键,选择Thread 2.查看当前的栈信息 3.去掉无用import ctrl + alt + o 阅读全文
摘要:
1.异步编程 串行操作并行化,涉及到异步化 异步化,是并行方案得以实施的接触,利用多线程优化性能这个核心方案来实施的基础。 jdk1.8提供了CompletableFuture支持异步编程 2.CompletableFuture 核心优势 烧水泡茶,3个任务 任务1,洗水壶,烧开水 任务2,洗茶壶, 阅读全文
摘要:
1.如何使用线程池 ThreadPoolExecutor是否提供了获取任务执行结果的功能呢 2.如何获取任务执行结果 3个sumit方法+1个futureTask工具类 Future<?> submit(Runnable task); <T> Future<T> submit(Callable<T> 阅读全文
摘要:
1.创建线程 创建对象,仅仅在jvm堆里分配一块内存 创建线程,调用操作系统内核api,操作系统为线程分配一系列资源,线程是重量级对象,应该避免频繁创建和销毁 2.线程池 线程池和一版池化资源不同,一般池化资源是acquire申请资源,release释放资源 java提供的线程池里没有申请线程和释放 阅读全文
摘要:
1.原子类 可见性问题,可以通过volatile解决 原子性问题,可以采用互斥锁方案 2.无锁方案 public class Test { AtomicLong count = new AtomicLong(0); void add10K() { int idx = 0; while(idx++ < 阅读全文
摘要:
1.并发容器 容器4大类List,Map,Set,Queue 但不是所有的容器都是线程安全的 2.非线程安全的容器如何变为线程安全的容器 把非线程安全的容器封装在对象内部,控制好访问路径就可以了 3.ArrayList 变为线程安全的的列表 SafeArrayList SafeArrayList<T 阅读全文
摘要:
1.校对逻辑 2.单线程里循环查询订单,派送单,执行对账 while(存在未对账订单){ // 查询未对账订单 pos = getPOrders(); // 查询派送单 dos = getDOrders(); // 执行对账操作 diff = check(pos, dos); // 差异写入差异库 阅读全文
摘要:
1.StampedLock 读多写少的场景,StampedLock性能比读写锁更好 2.StampedLock 支持的三种锁模式 读写锁,2种模式,读锁,写锁 stampedLock是3种模式,写锁,悲观锁,乐观锁 写锁,悲观锁的语意和ReadWriteLock的写锁,读锁,语意类似,允许多个线程同 阅读全文
摘要:
1.其他工具类 用途:分场景优化性能,提升易用性 2.并发场景,读多写少 使用缓存,缓存元数据,缓存基础数据 缓存的数据一定是读多写少 3.读写锁ReadWriteLock 非常容易使用,性能很好 1.允许多个线程同时读共享变量 2.只允许一个线程写共享变量 3.如果一个写线程正在执行写操作,此时禁 阅读全文
摘要:
1.Semaphore 信号量,类比红绿灯 编程中,线程能不能执行,看信号量是否允许 2.信号量模型 计数器+等待队列+三个方法 计数器和等待队列对外是透明的,只能通过提供的三个方法(init,down,up)来访问它们 init()设置计数器的初始值 down()计数器值减1,计数器当前值小于0, 阅读全文
摘要:
Dubbo用管程实现异步转同步 Lock可以响应中断,支持超时,以及非阻塞获取锁 Condition实现了管程里面的条件变量 synchronized里的条件变量只有1个,而Lock和Condition的组合可以有多个条件变量 1.利用两个条件变量实现阻塞队列 阻塞队列,2个条件变量,1个是队列不空 阅读全文
摘要:
1.并发领域核心问题互斥 同一时刻只能一个线程访问共享资源。 Lock解决互斥问题 2.并发领取核心问题同步 线程之间如何通信,协作 Condition解决同步问题 3.为什么要重复造轮子 synchronized已经实现管程,为什么要再实现一遍管程 synchronized性能不好 synchro 阅读全文
摘要:
面向对象思想写并发程序 1. 封装共享变量 面向对象封装, 属性和实现细节封装在对象内部,外部通过公共方法简介访问内部属性 将共享变量作为对象属性封装在内部,对外公共方法制定并发访问策略 以计数器为例,共享变量value,将公共方法get和addOne声明为同步方法,这样就对共享变量的操作就变成了线 阅读全文
摘要:
1.局部变量的线程安全问题 局部变量不是共享变量 2.方法是如何被执行的 cpu找到方法的地址,跳到地址执行代码。 cpu从cpu的堆栈寄存器找到方法的参数和返回地址。方法栈 3.局部变量存哪里 方法内的局部变量存哪里 局部变量和方法同生同死。 方法调用栈的栈帧就是和方法同生同死 所以局部变量放到方 阅读全文
摘要:
1.为什么要使用多线程 提升程序性能 衡量性能指标主要由吞吐量和延迟, 延迟:越短,程序执行的越快,性能越好 吞吐量:单位时间能处理的请求数,吞吐量越大,程序处理的请求越多,性能越好 核心 第延迟,高吞吐量 2.多线程应用场景 优化算法 硬件性能发挥到极致(提升IO的利用率和cpu利用率) 多线程方 阅读全文
摘要:
1.java的线程与操作系统线程一一对应 2.通用线程生命周期 初试状态,可运行状态,运行状态,休眠状态,终止状态 初试状态,线程已经被创建,还不允许被cpu执行,编程语言特有的,而操作系统还没有被创建 可运行状态,线程可以被cpu执行,这种状态下,真正操作系统的线程已经被成功创建了,可以分配cpu 阅读全文
摘要:
1.管程 管程就是解决并发问题的万能钥匙 管理共享变量以及对共享变量的操作过程,让他们支持并发 2.MESA模型 互斥:统一个时刻只允许一个线程访问共享资源 同步:线程之间如何通信,协作 解决互斥问题:将共享变量及对共享变量的操作统一封装起来。 将线程不安全的队列封装起来,对外提供线程安全的操作方法 阅读全文
摘要:
1.安全性问题 线程安全:本质上就是正确性。 避免原子性问题,可见性问题,有序性问题,就是线程安全的程序 什么情况需要考虑安全性问题? 存在共享数据并且该数据会发生变化。多线程同时读写同一数据。 如果不共享数据,状态就不会发生变化 ThreadLocal,TLS ,不变模式 2.活跃性问题 某个操作 阅读全文
摘要:
1.循环等待 转出账本和转入账本不满足时,用死循环的方式循环等待 // 一次性申请转出账户和转入账户,直到成功 while(!actr.apply(this, target)) ; 耗时非常短,并发冲突量不大时,还可以,耗时长的话,太耗cpu了 2.最优解决方案 线程要求的条件(转出账本和转入账本同 阅读全文
摘要:
1.3个人互相转账 3个人互相转账,串行 2.账本 文件架上有转出账本+转入账本,同时拿走 文件架上只有转出账本,柜员就先把文件架上的转出账本拿到手里,同时等着另一个账本送回来。 文件架上一个账本都没有,等两个账本都回来。 3.明细 class Account { private int balan 阅读全文
摘要:
1.一把锁保护多个资源 受保护资源和锁的关系是N:1 2.保护没有关联关系的多个资源 银行业务中针对账户余额的取款操作 银行业务中针对账户密码的更改操作 为账户余额和密码修改分配不同的锁来解决并发问题 代码,两把锁ballLock,pwLock分别保护不同的资源 class Account { // 阅读全文
摘要:
1.原子性 一个或多个操作在cpu执行的过程中不被中断的特性,称为原子性 2.如何解决原子性问题 源头是执行一半线程切换,禁止线程切换是不是就可以了? 操作系统的线程切换,是操作系统自己控制cpu进行的,所以禁止操作系统的cpu发生中断就可以禁止线程切换 单核cpu场景,同一时刻只有一个线程执行,禁 阅读全文
摘要:
1.前情提要 可见性,原子性,有序性,称为并发编程的bug之源 2.java的内存模型 导致可见性问题是cpu缓存引起 导致有序性问题是编译器优化 那么解决方案是什么? 禁用缓存和禁用编译优化,但是程序性能就下降了 那么如何能保证性能的同时,又解决了可见性及有序性问题? 该禁用缓存和编译优化的时候禁 阅读全文
摘要:
1.计算机硬件的速度差异 cpu 》 内存 》 磁盘 木桶理论,(水桶能装多少水,取决于最短的木板) 程序整体的性能取决于最慢的操作——读写 I/O 设备,也就是说单方面提高 CPU 性能是无效的。 计算机做了什么? 1.cpu增加了缓存,来均衡与内存的差异 2.操作系统增加了进程,线程,分时复用C 阅读全文