06 2021 档案

摘要:1.为什么要使用多线程 提升程序性能 衡量性能指标主要由吞吐量和延迟, 延迟:越短,程序执行的越快,性能越好 吞吐量:单位时间能处理的请求数,吞吐量越大,程序处理的请求越多,性能越好 核心 第延迟,高吞吐量 2.多线程应用场景 优化算法 硬件性能发挥到极致(提升IO的利用率和cpu利用率) 多线程方 阅读全文
posted @ 2021-06-30 18:16 SpecialSpeculator 阅读(310) 评论(0) 推荐(0) 编辑
摘要:1.java的线程与操作系统线程一一对应 2.通用线程生命周期 初试状态,可运行状态,运行状态,休眠状态,终止状态 初试状态,线程已经被创建,还不允许被cpu执行,编程语言特有的,而操作系统还没有被创建 可运行状态,线程可以被cpu执行,这种状态下,真正操作系统的线程已经被成功创建了,可以分配cpu 阅读全文
posted @ 2021-06-30 17:40 SpecialSpeculator 阅读(44) 评论(0) 推荐(0) 编辑
摘要:1.管程 管程就是解决并发问题的万能钥匙 管理共享变量以及对共享变量的操作过程,让他们支持并发 2.MESA模型 互斥:统一个时刻只允许一个线程访问共享资源 同步:线程之间如何通信,协作 解决互斥问题:将共享变量及对共享变量的操作统一封装起来。 将线程不安全的队列封装起来,对外提供线程安全的操作方法 阅读全文
posted @ 2021-06-30 17:11 SpecialSpeculator 阅读(26) 评论(0) 推荐(0) 编辑
摘要:1.安全性问题 线程安全:本质上就是正确性。 避免原子性问题,可见性问题,有序性问题,就是线程安全的程序 什么情况需要考虑安全性问题? 存在共享数据并且该数据会发生变化。多线程同时读写同一数据。 如果不共享数据,状态就不会发生变化 ThreadLocal,TLS ,不变模式 2.活跃性问题 某个操作 阅读全文
posted @ 2021-06-30 17:00 SpecialSpeculator 阅读(88) 评论(0) 推荐(0) 编辑
摘要:1.循环等待 转出账本和转入账本不满足时,用死循环的方式循环等待 // 一次性申请转出账户和转入账户,直到成功 while(!actr.apply(this, target)) ; 耗时非常短,并发冲突量不大时,还可以,耗时长的话,太耗cpu了 2.最优解决方案 线程要求的条件(转出账本和转入账本同 阅读全文
posted @ 2021-06-30 16:41 SpecialSpeculator 阅读(72) 评论(0) 推荐(0) 编辑
摘要:1.3个人互相转账 3个人互相转账,串行 2.账本 文件架上有转出账本+转入账本,同时拿走 文件架上只有转出账本,柜员就先把文件架上的转出账本拿到手里,同时等着另一个账本送回来。 文件架上一个账本都没有,等两个账本都回来。 3.明细 class Account { private int balan 阅读全文
posted @ 2021-06-30 16:21 SpecialSpeculator 阅读(36) 评论(0) 推荐(0) 编辑
摘要:1.一把锁保护多个资源 受保护资源和锁的关系是N:1 2.保护没有关联关系的多个资源 银行业务中针对账户余额的取款操作 银行业务中针对账户密码的更改操作 为账户余额和密码修改分配不同的锁来解决并发问题 代码,两把锁ballLock,pwLock分别保护不同的资源 class Account { // 阅读全文
posted @ 2021-06-25 16:15 SpecialSpeculator 阅读(78) 评论(0) 推荐(0) 编辑
摘要:1.原子性 一个或多个操作在cpu执行的过程中不被中断的特性,称为原子性 2.如何解决原子性问题 源头是执行一半线程切换,禁止线程切换是不是就可以了? 操作系统的线程切换,是操作系统自己控制cpu进行的,所以禁止操作系统的cpu发生中断就可以禁止线程切换 单核cpu场景,同一时刻只有一个线程执行,禁 阅读全文
posted @ 2021-06-25 15:23 SpecialSpeculator 阅读(72) 评论(0) 推荐(0) 编辑
摘要:1.前情提要 可见性,原子性,有序性,称为并发编程的bug之源 2.java的内存模型 导致可见性问题是cpu缓存引起 导致有序性问题是编译器优化 那么解决方案是什么? 禁用缓存和禁用编译优化,但是程序性能就下降了 那么如何能保证性能的同时,又解决了可见性及有序性问题? 该禁用缓存和编译优化的时候禁 阅读全文
posted @ 2021-06-25 14:02 SpecialSpeculator 阅读(94) 评论(0) 推荐(0) 编辑
摘要:1.计算机硬件的速度差异 cpu 》 内存 》 磁盘 木桶理论,(水桶能装多少水,取决于最短的木板) 程序整体的性能取决于最慢的操作——读写 I/O 设备,也就是说单方面提高 CPU 性能是无效的。 计算机做了什么? 1.cpu增加了缓存,来均衡与内存的差异 2.操作系统增加了进程,线程,分时复用C 阅读全文
posted @ 2021-06-24 16:09 SpecialSpeculator 阅读(179) 评论(0) 推荐(0) 编辑
摘要:1.golang 语言层面支持并发的编程语言,支持并发是golang的非常重要特性 golang支持的是协程,可以类比java中的线程,解决并发问题的难点就是(线程之间的协作) 2.golang如何解决多协程之间的协作问题呢 (1)共享内存方式通信 golang也像java一样提供了管程和原子类对协 阅读全文
posted @ 2021-06-23 16:01 SpecialSpeculator 阅读(553) 评论(0) 推荐(0) 编辑
摘要:1.协程 轻量级线程 Coroutine 线程是内核态调度的,协程是用户态调度的,用户态调度的资源消耗更小,性能更高 内核态用户态之间切换有成本 线程的栈大小:1M 协程的栈大小:几K或者几十K 2.Golang中的协程示例 import ( "fmt" "time" ) func hello(ms 阅读全文
posted @ 2021-06-22 18:20 SpecialSpeculator 阅读(68) 评论(0) 推荐(0) 编辑
摘要:1.四种模型 同步阻塞,同步非阻塞,异步阻塞,异步非阻塞 2.同步异步之说 是线程之间调用的说法 调用者与被调用者,它们是线程之间的关系 两个线程要么是同步,要么是异步 同步操作:调用线程需要等待被调用线程返回结果,才会进行下一步 异步操作:调用线程不需要等待被调用线程返回结果,被调用线程一版依赖事 阅读全文
posted @ 2021-06-22 18:02 SpecialSpeculator 阅读(83) 评论(0) 推荐(0) 编辑
摘要:docker容器实际案例 1.使用docker部署python写的web应用 from flask import Flask import socket import os app = Flask(__name__) @app.route('/') def hello(): html = "<h3> 阅读全文
posted @ 2021-06-21 16:01 SpecialSpeculator 阅读(84) 评论(0) 推荐(0) 编辑
摘要:1.前情提要 面向对象编程理论中,对象之间通信,依赖的是消息,但java里,对象之间通信,用的是对象方法 2.Actor模型 计算模型,计算单位Actor,所有的计算都在Actor中执行 Actor中一切都是actor,actor之间完全隔离,不共享任何变量 不共享变量,就不会有并发问题 java本 阅读全文
posted @ 2021-06-21 14:04 SpecialSpeculator 阅读(238) 评论(0) 推荐(0) 编辑
摘要:1.高性能数据库连接池HiKarCP c3p0,DBCP,Tomcat JDBC Connection Pool,Druid 最火的是Hikaricp 最快的数据库连接池,springboot2.0作为默认数据库连接池 2.数据库连接池 池化资源,避免重量级资源的频繁创建和销毁。数据库连接池就是避免 阅读全文
posted @ 2021-06-19 14:18 SpecialSpeculator 阅读(260) 评论(0) 推荐(0) 编辑
摘要:1.容器概念回溯 容器本质是一种特殊的进程 namespace作用是视觉隔离,cgroups作用是限制,给沙箱围了已圈墙 2.容器内看到的文件系统是什么样子? 联想Mount namespace问题 容器里的应用进程,按理应该看到一份完全独立的文件系统,这样就可以在自己容器目录(/tmp)下操作 不 阅读全文
posted @ 2021-06-18 17:14 SpecialSpeculator 阅读(106) 评论(0) 推荐(0) 编辑
摘要:1.为什么要用高性能队列Disruptor 为什么要说Disruptor?java SDK提供了2个有界队列 ArrayBlockQueue,LinkedBlockingQueue,基于ReentrantLock锁实现,在高并发情况下,锁的效率不高,更好的替代品有木有?Dosritpr 2.Disr 阅读全文
posted @ 2021-06-18 14:30 SpecialSpeculator 阅读(353) 评论(0) 推荐(0) 编辑
摘要:1.隔离 使用namespace技术,实现隔离 namespace 实际上修改了应用进程看待整个计算机的视图,即它的视线被操作系统做了限制,只能看到某些指定内容 。对宿主机来说,这些被“隔离”的进程和其他进程没有啥太大差别 2.说明 用户运行在容器里的业务进程,和宿主机上其他进程一样,都是由宿主机操 阅读全文
posted @ 2021-06-17 18:18 SpecialSpeculator 阅读(173) 评论(0) 推荐(0) 编辑
摘要:1.并发案例,限流Guava RateLimiter Guava RateLimiter 如何解决高并发的限流问题 guava中的工具类RateLimiter 2.简单实用RateLimiter 假设已有线程池,每秒只能处理两个任务,提交任务过快,可能导致系统不稳定,用到限流 创建一个2个请求/秒的 阅读全文
posted @ 2021-06-17 16:12 SpecialSpeculator 阅读(224) 评论(0) 推荐(0) 编辑
摘要:1.基础知识:进程 前情提要(docker 通过镜像技术,解决了应用打包的根本性难题) 2.容器本身没有价值,有价值的是"容器编排" 3.容器 容器其实是一种沙盒技术,就像集装箱一样,把应用装起来的技术 应用于应用之间,有了边界而不至于互相干扰 被装进集装箱的应用,可以方便搬来搬去 4.程序,进程 阅读全文
posted @ 2021-06-16 21:03 SpecialSpeculator 阅读(310) 评论(0) 推荐(0) 编辑
摘要:1.Commons Logging和log4j 前情提要: Commons Logging和log4j好基友,一起走。Commons Logging负责充当日志API,log4j负责日志底层实现 搭配起来使用非常便于开发 2.SL4J和Logback SL4J类似于commons logging,也 阅读全文
posted @ 2021-06-16 14:27 SpecialSpeculator 阅读(649) 评论(0) 推荐(0) 编辑
摘要:1.生产者-消费者模式 Worker Thread模式类比现实工厂里车间工人的工作模式 生产者-消费者模式,类比显示工厂里流水线模式 2.应用场景 Log4j2异步Appender内部使用生产者-消费者模式。 3.生产者,消费者模式优点 核心:任务队列 生产者线程生产任务,并将任务添加到任务队列中 阅读全文
posted @ 2021-06-16 11:20 SpecialSpeculator 阅读(145) 评论(0) 推荐(0) 编辑
摘要:1.Assert断言 伪代码 assert x >= 0 : "x must >= 0"; // assert 即为断言, x >= 0预期为true,如果计算结果为false,则断言失败 2.assert断言失败,抛出AssertionError 抛出的是Error不是Exception 抛出错误 阅读全文
posted @ 2021-06-16 09:52 SpecialSpeculator 阅读(71) 评论(0) 推荐(0) 编辑
摘要:1.两阶段终止模式 如何优雅的终止线程? 2.线程执行完或者出现异常就会进入终止状态 现在要思考的是,不是自己终止自己,而是在线程T1中终止线程T2 而且是优雅的终止,给T2线程一个料理后事的机会,而不是被一剑封喉 3.历史 java的Thread类提供了一个stop方法,用来终止线程,但早已不适用 阅读全文
posted @ 2021-06-15 15:28 SpecialSpeculator 阅读(154) 评论(0) 推荐(0) 编辑
摘要:1.WorkThread 设计模式 可以有效避免频繁创建,销毁以及OOM问题 2.类比现实 类比车间的工作模式 车间工人,有活大家一起干,没活就聊聊天 车间里工人的数量是确定的 3.编程世界映射车间的套路呢 如何实现Worker Thread模式 阻塞队列做任务池,创建固定数量的线程消费阻塞队列。 阅读全文
posted @ 2021-06-11 16:17 SpecialSpeculator 阅读(118) 评论(0) 推荐(0) 编辑
摘要:1.Thread-Pre-Message 设计模式 简单来说,就是为每个任务分配一个独立的线程,最简单的分工方法 2.并发领域3个核心问题 分工,同步,互斥 同步,互斥源自微观,分工来自宏观 Thread-Pre-Message其实就是一种分工模式 3.映射现实世界 教育小朋友搞不定,委托学校老师 阅读全文
posted @ 2021-06-10 20:53 SpecialSpeculator 阅读(95) 评论(0) 推荐(0) 编辑
摘要:1.Balking模式 线程安全的单例模式 2.多线程的if 多线程if条件快速放弃的方案 3.案例精选 编辑器自动保存功能 每隔一段时间自动执行存盘操作,前提是文件做过修改。如果文件没有做过操作,不要等待,快速放弃存盘。和上一篇的Guarder Suspension在这一点有很大的不同。Guard 阅读全文
posted @ 2021-06-10 17:26 SpecialSpeculator 阅读(74) 评论(0) 推荐(0) 编辑
摘要:1.Guarded Suspension设计模式 等待唤醒机制的规范实现 2.业务场景 用户发请求->异步消息->MQ->等MQ返回结果,结果返回浏览器 给mq发消息的线程是T1,但消费mq结果的线程不是T1,那么线程T1如何等待MQ的返回结果? 3.伪代码 class Message{ Strin 阅读全文
posted @ 2021-06-07 23:58 SpecialSpeculator 阅读(59) 评论(0) 推荐(0) 编辑
摘要:1.Copy-on-Write 又称COW,写时复制 String的replace()方法,没有修改内部的value数组,而是新创建了一个不可变对象 这种方法在解决不可变对象时,经常使用 这其实就是一种Copy-on-write方式 不可变对象的写操作往往都是使用 Copy-on-Write 方法解 阅读全文
posted @ 2021-06-03 18:26 SpecialSpeculator 阅读(86) 评论(0) 推荐(0) 编辑
摘要:1.什么是Immutability Immutability,不变性, 叫做不变性设计模式,简单来说就是对象一旦创建,状态就不再发生变化。 变量一旦被赋值,就不允许修改了(没有写操作);没有修改操作,就保持了不变性 2.什么情况用Immutablity设计模式 多个线程同时读写同一个共享变量存在并发 阅读全文
posted @ 2021-06-01 17:22 SpecialSpeculator 阅读(114) 评论(0) 推荐(0) 编辑
摘要:1.RunWith 注解 RunWith 就是一个运行器 可以在单元测试的时候,自动创建spring的应用上下文 2.正确使用 pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo 阅读全文
posted @ 2021-06-01 15:39 SpecialSpeculator 阅读(875) 评论(0) 推荐(0) 编辑
摘要:泛型类,泛型方法的使用 传递入对象类型,返回出对象类型都是泛型 接口 public interface CloudParamGetter<IN, OUT> { OUT get(IN in); } 实现 public class VmParamGetter implements CloudParamG 阅读全文
posted @ 2021-06-01 15:34 SpecialSpeculator 阅读(60) 评论(0) 推荐(0) 编辑
摘要:1.Mapper注解 在接口类上添加@Mapper,在运行时动态代理生成实现类 @Mapper public interface UserDao { // User getUser(); } 如果想要每个接口都要变成实现类,那么需要在每个接口上都添加@Mapper注解,比较麻烦,可以使用@Mappe 阅读全文
posted @ 2021-06-01 15:22 SpecialSpeculator 阅读(616) 评论(0) 推荐(0) 编辑
摘要:1.说明 Configuration注解的出现就是为了替换xml文件 java配置是通过@Configuration和@Bean注解实现了 @Configuration注解,声明当前是一个配置类,相当于是spring中的一个xml文件 @Bean 注解: 作用在方法上,声明当前方法的返回值是一个Be 阅读全文
posted @ 2021-06-01 15:10 SpecialSpeculator 阅读(1575) 评论(0) 推荐(0) 编辑
摘要:1.消息的发送流程 一条消息从生产到被消费,将会经历3个阶段 生产阶段,Producer 新建消息,然后通过网络将消息投递给MQ Broker 存储阶段,消息将会存储在Broker端磁盘中 消费阶段,Consumer将会从Broker拉取消息 以上3个阶段,都有可能会丢失消息,只要找到这3个阶段丢失 阅读全文
posted @ 2021-06-01 14:29 SpecialSpeculator 阅读(431) 评论(0) 推荐(0) 编辑
摘要:# 1.自定义异常 ```java public class CreateFailedException extends RuntimeException{ public CreateFailedException(String errMsg) { super(errMsg); } /** * Co 阅读全文
posted @ 2021-06-01 11:25 SpecialSpeculator 阅读(44) 评论(0) 推荐(0) 编辑
摘要:1.介绍 面向切面编程——AOP 的具体实现 你可以使用 Interceptor 来执行某些任务,例如在 Controller 处理请求之前编写日志,添加或更新配置…… 在 Spring中,当请求发送到 Controller 时,在被Controller处理之前,它必须经过 Interceptors 阅读全文
posted @ 2021-06-01 10:56 SpecialSpeculator 阅读(195) 评论(0) 推荐(0) 编辑
摘要:0.ApiException /** * controller exception annotation */ @Retention(RUNTIME) @Target(METHOD) public @interface ApiException { Status value(); } 1.配置全局异 阅读全文
posted @ 2021-06-01 10:47 SpecialSpeculator 阅读(190) 评论(0) 推荐(0) 编辑
摘要:1.需求 需要扫描某个包中的某个接口的实现类的需求 2.maven 依赖引入 <dependency> <groupId>org.reflections</groupId> <artifactId>reflections</artifactId> <version>0.9.11</version> 阅读全文
posted @ 2021-06-01 10:40 SpecialSpeculator 阅读(411) 评论(0) 推荐(0) 编辑
摘要:1. Controller接收Date类型的数据 核心使用@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 来将传递过来的时间字符串转化为Date类型 @RestController @RequestMapping("res") public clas 阅读全文
posted @ 2021-06-01 10:24 SpecialSpeculator 阅读(604) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示