03 2022 档案
15-并发设计模式
摘要:并发(多线程)设计模式不同于传统设计模式,更关注的是并发编程中特定场景的解决方案。对于并发设计模式同学们务必理解。 终止线程的设计模式 思考:在一个线程 T1 中如何正确安全的终止线程 T2? 错误思路1:使用线程对象的 stop() 方法停止线程 stop 方法会真正杀死线程,如果这时线程锁住了共
阅读全文
14-Future&CompletableFuture
摘要:Callable&Future&FutureTask 直接继承Thread或者实现Runnable接口都可以创建线程,但是这两种方法都有一个问题就是:没有返回值,也就是不能获取执行完的结果。因此java1.5就提供了Callable接口来实现这一场景,而Future和FutureTask就可以和Ca
阅读全文
13-高性能内存队列Disruptor
摘要:Disruptor简介 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年,企业
阅读全文
12-ForkJoin
摘要:任务类型 思考: 线程池的线程数设置多少合适? 我们调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能。在实际工作中,我们需要根据任务类型的不同选择对应的策略。 CPU密集型任务 CPU密集型任务也叫计算密集型任务,比如加密、解密、压缩、计
阅读全文
11-阻塞队列BlockingQueue
摘要:阻塞队列介绍 Queue接口 public interface Queue<E> extends Collection<E> { //添加一个元素,添加成功返回true, 如果队列满了,就会抛出异常 boolean add(E e); //添加一个元素,添加成功返回true, 如果队列满了,返回fa
阅读全文
10-AQS之ReentrantReadWriteLock
摘要:读写锁 现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁(读多写少)。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源(读读可以并发);但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写操作了(读写,写读,
阅读全文
09-Semaphorer&CountDownLatch&CyclicBarrie
摘要:Semaphore Semaphore介绍 Semaphore,俗称信号量,它是操作系统中PV操作的原语在java的实现,它也是基于AbstractQueuedSynchronizer实现的。 Semaphore的功能非常强大,大小为1的信号量就类似于互斥锁,通过同时只能有一个线程获取信号量实现。大
阅读全文
08-AQS之ReentrantLock
摘要:AQS原理分析 什么是AQS java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这些行为的抽象就是基于AbstractQueuedSynchronizer(简称AQS)实现的,AQS是一个抽象同步框架,可以用来实现
阅读全文
07-深入理解synchronized
摘要:Java共享内存模型带来的线程安全问题 思考: 两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗? @Slf4j public class SyncDemo { private static volatile int counter = 0; public
阅读全文
06-Atomic原子操作类详解
摘要:Atomic原子操作类介绍 在并发编程中很容易出现并发安全的问题,有一个很简单的例子就是多线程更新变量i=1,比如多个线程执行i++操作,就有可能获取不到正确的值,而这个问题,最常用的方法是通过Synchronized进行控制来达到线程安全的目的。但是由于synchronized是采用的是悲观锁策略
阅读全文
05-深入理解CAS
摘要:什么是 CAS CAS(Compare And Swap,比较并交换),通常指的是这样一种原子操作:针对一个变量,首先比较它的内存值与某个期望值是否相同,如果相同,就给它赋一个新值。 CAS 的逻辑用伪代码描述如下: if (value == expectedValue) { value = new
阅读全文
04-深入理解Java线程
摘要:线程基础知识 线程和进程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中 还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的 。 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程
阅读全文
03-Java并发线程池
摘要:线程池与线程对比: 线程方式 import java.util.ArrayList; import java.util.List; import java.util.Random; /*** * 使用线程的方式去执行程序 */ public class ThreadTest { public sta
阅读全文
02-并发的三大特性和volatile
摘要:并发和并行 目标都是最大化CPU的使用率 并行(parallel): 指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。 并发(concurrency): 指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时
阅读全文
01-CPU缓存架构&缓存一致性协议
摘要:CPU高速缓存(Cache Memory) CPU高速缓存 CPU缓存即高速缓冲存储器,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据
阅读全文
02-SpringBoot启动原理
摘要:SpringBoot启动流程: 调用SpringApplication.run启动springboot应用 public static void main(String[] args) { SpringApplication.run(ServiceApplication.class, args);
阅读全文
01-springboot自动装配原理
摘要:Springboot自动装配原理详解 传统配置 1)传统ssm整合redis的时候 需要在xml的配置文件中 进行大量的配置Bean 第一步:加入依赖 <dependency> <groupId>org.springframework.data</groupId> <artifactId>sprin
阅读全文
04-SpringMVC之请求处理流程
摘要:SpringMVC之请求处理流程 我们知道DispatcherServlet就是一个HttpServlet,而HttpServlet的请求就从doGet/doPost开始 DispatcherServlet本身没有实现doGet/doPost,而由他的父类FrameworkServlet实现,源码如
阅读全文
03-SpringMVC容器初始化
摘要:Servlet项目启动执行顺序 由前面的回顾内容可知,Servlet项目启动执行顺序如下 ServletContainerInitializer.onStartup(Set<Class<?>> c, ServletContext ctx) ServletContextListener.context
阅读全文
02-手写简易SpringMVC
摘要:手写简易SpringMVC 思路分析: 1.启动tomcat 2.spi机制加载spring容器,扫描包,生成bean,并且将注解解析到Map<String,RequestMappingInfo> map中 3.get/post请求时,. 根据url获取对应的RequestMappingInfo对象
阅读全文
01-Servlet 回顾
摘要:通过url访问资源有三个步骤: 接收请求 处理请求 响应请求 web服务器:将某个主机上的资源映射为一个URL供外界访问,完成接收和响应请求 servlet容器:存放着servlet对象(由程序员编程提供),处理请求 Servlet接口 Servlet接口定义了5种方法: init() servic
阅读全文
09-Spring 设计模式总结
摘要:简单工厂——BeanFactory 实现方式: BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。 实质: 由一个工厂类根据传入的参数,动态决定应该创建哪一
阅读全文
08-Spring之事务
摘要:Spring事务 Spring事务使用 我们以JdbcTemplate为例,其他orm框架也是一样的原理 配置类 @EnableTransactionManagement @Configuration @ComponentScan("com.yoocar.spring") public class
阅读全文
07-Spring整合Mybatis
摘要:Spring之整合Mybatis 整合核心思路 由很多框架都需要和Spring进行整合,而整合的核心思想就是把其他框架所产生的对象放到Spring容器中,让其成为Bean。 比如Mybatis,Mybatis框架可以单独使用,而单独使用Mybatis框架就需要用到Mybatis所提供的一些类构造出对
阅读全文
06-Spring之循环依赖
摘要:循环依赖 什么是循环依赖? 很简单,就是A对象依赖了B对象,B对象依赖了A对象。 比如: // A依赖了B class A{ public B b; } // B依赖了A class B{ public A a; } 那么循环依赖是个问题吗? 如果不考虑Spring,循环依赖并不是问题,因为对象之间
阅读全文
05-Spring之AOP
摘要:Spring之AOP 动态代理 代理模式的解释:为其他对象提供一种代理以控制对这个对象的访问,增强一个类中的某个方法,对程序进行扩展。 比如,现在存在一个类: public class UserServiceCGlib { public void test() { System.out.printl
阅读全文
04-Spring之依赖注入
摘要:Spring依赖注入的方式 依赖注入底层原理流程图: https://www.processon.com/view/link/5f899fa5f346fb06e1d8f570 首先分两种: 手动注入 自动注入 手动注入 在XML中定义Bean时,就是手动注入,因为是程序员手动给某个属性指定了值。 <
阅读全文
03-Spring之Bean生命周期
摘要:Spring之Bean生命周期 Bean的生命周期 Bean的生命周期就是指:在Spring中,一个Bean是如何生成的,如何销毁的 Bean生命周期流程图 Bean的生成过程 主要源码流程:scan getBean--doGetBean--createBean--doCreateBean 1. 解
阅读全文
02-Spring启动过程
摘要:Spring启动过程 通常,我们说的Spring启动,就是构造ApplicationContext对象以及调用refresh()方法的过程。代码如下 AnnotationConfigApplicationContext applicationContext=new AnnotationConfigA
阅读全文
01-Spring核心概念
摘要:核心概念介绍 BeanDefinition BeanDefinition表示Bean定义,BeanDefinition中存在很多属性用来描述一个Bean的特点。 比如: String: getBeanClassName: 返回当前bean definition定义的类名 ConstructorArg
阅读全文
Mybatis中的设计模式
摘要:Mybatis中的设计模式 虽然我们都知道有26个设计模式,但是大多停留在概念层面,真实开发中很少遇到,Mybatis源码中使用了大量的设计模式,阅读源码并观察设计模式在其中的应用,能够更深入的理解设计模式。 Mybatis至少遇到了以下的设计模式的使用: Builder模式,例如SqlSessio
阅读全文
Mybatis插件原理和自定义插件
摘要:Mybatis插件原理 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能。那么拦截器拦截MyBatis中的哪些内容呢? 我们进入官网看一看: MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调
阅读全文
Mybatis缓存
摘要:Mybatis缓存 二级缓存 1、二级缓存的定义 二级缓存也称作是应用级缓存,与一级缓存不同的是它的作用范围是整个应用,而且可以跨线程使用。所以二级缓存有更高的命中率,适合缓存一些修改比较少的数据。 2、二级缓存扩展性需求 二级缓存的生命周期是整个应用,所以必须限制二级缓存的容量,在这里mybati
阅读全文
MyBatis启动流程
摘要:MyBatis启动流程 加载配置文件build() String resource = "mybatis.xml"; //将XML配置文件构建为Configuration配置类 //读取配置文件,生成读取流 InputStream inputStream = Resources.getResourc
阅读全文